Newsmind — RSS for your AI
Read and search your RSS feeds
- Category
- AI
- Primary Subcategory
- News & Feed Reading
Integration details
Description
Newsmind connects your RSS subscriptions to ChatGPT. Ask what's new and get briefings from the sources you chose; search your feeds by keyword or by meaning; group the same story across outlets; star and organize articles; and set watches on topics so matches are waiting next time you ask. Read position syncs across conversations, and existing subscriptions import in one step via OPML.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- News & Feed Reading
- Secondary Subcategories
- None listed
- Brand
- Newsmind
- Access
- Account required
- First tracked
- 2026-08-12
- Tool count
- 29
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT News & Feed Reading
View Category29 tools agents can invoke
Per-feed diagnostics for the user's subscriptions. Returns last successful poll, consecutive failure count, last error, last article date, and articles-per-week rate. Use this when the user asks 'which feeds are dead', 'which feeds are broken', 'which feeds haven't published lately', or wants to prune their subscription list. status is computed: 'healthy' (recent activity, no errors), 'stale' (no articles in 30+ days), 'failing' (consecutive errors), 'idle' (no articles in 90+ days). feed_id narrows to one feed.
get_feed_health
Group redundant coverage in the user's feeds into clusters. Use when the user asks 'what's the big news', 'group my feed by story', 'what's everyone covering', 'am I subscribed to overlapping feeds', or to cut noise on a busy news day. **Pick a matching strategy with `match`:** - `semantic` (default) — same STORY across DIFFERENT outlets, matched by MEANING using article embeddings, so differently-worded coverage of one event clusters together (e.g. 'SpaceX files for IPO' from TechCrunch, The Verge, Engadget, and Ars). Best for 'what's the big news'. - `exact` — the same ITEM literally syndicated into several feeds, matched by canonical URL or near-identical title. Best for 'do I have overlapping subscriptions' (HN front page + a HN-curated newsletter, NYT + an NYT topic feed). Cheaper than semantic and catches items with no embedding. - `both` — runs exact first, then semantic, and drops semantic clusters already fully covered by an exact one. Each cluster returns a `canonical` article (the outlet that published earliest) plus `also_covered_by` (the rest), along with the `match` kind that produced it. Clusters span at least 2 distinct feeds; singletons and single-feed repeats are dropped. Sorted largest-first. Semantic matching skips the small fraction of articles with no embedding; exact matching covers those.
get_story_clusters
Save a watch so future sessions surface new matches automatically. Use when the user says 'let me know when the M5 Mac mini ships', 'track mentions of Infisical', 'watch for anything about Stripe pricing'. Keyword watches (default) use PHRASE matching — the query words must appear adjacent and in order (e.g. 'M5 Mac mini' matches 'the new M5 Mac mini' but not a roundup that merely mentions M5, Mac, and mini scattered apart). This keeps a watch quiet unless an article is really on-target. Word order matters — phrase the query the way a headline would read ('OLED iPad mini', not 'iPad mini OLED'). For tracking a concept across many phrasings, use a semantic watch (kind='semantic', NEWSMIND MAX ONLY), which matches by meaning via embeddings and is order-insensitive. Optionally scope to one feed (feed_id) or a folder (folder). For out-of-band alerts set delivery='email' or 'webhook' with a cadence; default delivery is in_session (surfaced via get_new_articles + get_watch_matches). Returns the new watch_id and a backfilled_matches count (existing in-window articles that already matched). Per-plan active-watch caps apply (Pro 20, Max 100).
create_watch
Remove a saved watch (and its match history). Use when the user says 'stop watching X'. Idempotent — a non-existent watch_id returns ok=false rather than throwing. To temporarily silence a watch instead, use update_watch with active=false.
delete_watch
Export the user's RSS subscriptions as an OPML 2.0 document — the standard portable format every RSS reader (Feedly, Inoreader, NetNewsWire, etc.) imports. Subscriptions are grouped by folder. Use when the user asks 'export my feeds', 'give me an OPML', 'I want to back up my subscriptions', or 'how do I move my feeds elsewhere'. Returns OPML XML as text the user can save to a .opml file.
export_opml
Return the status of the user's pending OPML imports. Call this when the user asks 'how is my import going', 'how many feeds are left to import', 'did all my feeds get added', or after import_opml returns a non-zero `queued` count. Reports `pending` (still waiting for the worker), `succeeded` (added in the last 24h), and `failed` (validation rejected — e.g. dead URL or non-feed) row counts plus a sample of the most recent failures. Read-only.
get_import_status
Return the caller's Newsmind account info — email, plan tier (pro/max/expired), subscription status, billing period end, trial end, feed limit (max feeds the plan allows), and current feed count. Call this whenever the user asks about their account, plan, billing, trial, or feed quotas — e.g. 'who am I logged in as', 'what plan am I on', 'when does my trial end', 'what's my feed limit', 'how many feeds can I have', 'am I close to my quota', 'how many feeds do I have'. Read-only. **Proactive feed-health.** When the response includes a `feed_warnings` field (only present when one or more feeds are in the poller's give-up state, error_count ≥ 3), mention it to the user — e.g. "N of your feeds are currently failing to fetch; here are a few — use get_feed_health for full diagnostics or unsubscribe_from_feed to remove dead ones." Field shape: `{ failing_count, failing_samples: [{feed_id, title, last_error}] }`. Absent on healthy accounts. **Import failures.** When the response includes an `import_failures` field (only present when feed imports failed permanently in the last 7 days), tell the user which of their requested feeds never got added — call get_import_status for URLs and reasons. Absent when there's nothing to report.
get_account_info
Cheap overview: count articles grouped by feed, day, or hour. Returns small aggregate data, not the articles themselves. Use this BEFORE get_unread_articles or search_articles_by_keyword when the user asks 'how many', 'which feeds', 'when', etc. — much smaller token footprint than fetching articles. Also doubles as a feed-velocity check: `get_article_counts(group_by="feed", since_hours=1)` shows which feeds have been the noisiest recently — useful when one feed is dominating the queue and you're deciding whether to suggest excluding it via `exclude_feed_ids` on get_unread_articles / get_new_articles.
get_article_counts
All articles from one feed, newest first, regardless of read or starred state. Use for archival browsing — 'what did WIRED publish this week', 'show me everything from MacRumors'. For unread-only, use get_unread_articles with feed_id instead. Subject to tier retention (Pro 30d / Max 90d) and the per-subscription `subscribed_at` cutoff.
get_articles_by_feed
One feed's metadata — id, title, URL, folder, last poll time, error status. For all the user's feeds, use get_feeds.
get_feed
Fetch the full content of a single article by ID, including read/starred status. Lazy-fetches via Mozilla Readability if the feed only had a summary (slower on first call; cached afterward).
get_article
Return articles published since the user's last check, oldest-first, and atomically advance the per-token cursor. Use this for 'what's new since I last asked?' across separate conversations — Claude doesn't need to remember anything; the server tracks the cursor per token. First call defaults to the last 24 hours. **Pagination.** If the response includes `has_more: true`, call again with the same args to fetch the next batch — the cursor has already advanced past what was returned, so subsequent calls pick up where the previous one left off. Loop until `has_more: false` to drain the full unread set when the user asks for 'everything'. **Peek mode.** Pass `mark_seen=false` to return articles without advancing the cursor — use when you want to preview what's new before committing to having shown it (e.g. user might cancel the conversation, you want to retry on a transient error). A subsequent call with `mark_seen=true` (the default) advances the cursor. **Filter.** Pass `exclude_feed_ids` to skip one or more feeds — typical use is 'what's new minus Hacker News' when a high-volume firehose feed is dominating the queue. **Proactive feed-health.** When the response includes a `feed_warnings` field (only present when at least one of the user's feeds is in the poller's give-up state, error_count ≥ 3), surface it to the user in your reply — e.g. "by the way, N of your feeds aren't being fetched; run get_feed_health for details or unsubscribe_from_feed to remove dead ones." Don't mention when the field is absent (healthy account = no noise). **Watch summaries.** When the response includes a `watch_summaries` field (only present when the user has saved watches), mention any watch with `new_match_count > 0` to the user — e.g. "by the way, your Fellow watch has 3 new matches." The user can then ask for detail, which you fulfill by calling `get_watch_matches(watch_id=…)`. Don't mention watches with 0 new matches. **Import failures.** When the response includes an `import_failures` field (only present when one or more of the user's feed imports failed permanently in the last 7 days), tell the user — part of what they asked for was never added and they don't know. Call get_import_status for the failed URLs and reasons. Don't mention when the field is absent.
get_new_articles
Return articles the user has marked read, most-recently-read first. Use when the user asks 'what have I read', 'show my reading history', 'what did I read about X last week'. Subject to tier retention — articles past the retention window are pruned and won't appear. feed_id narrows to one source; since_days narrows by read_at (when the user read it), not publish date.
get_reading_history
Return the user's starred articles, newest-starred first. Use when the user asks 'what have I starred', 'show my starred articles', 'what did I save this week', or wants to revisit favorites. Subject to tier retention — articles starred but past the retention window (Pro 30d / Max 90d) are not returned, since stars do not bypass retention. feed_id narrows to one source.
get_starred_articles
Get unread articles, most recent first. Use for 'what's new', 'what landed today', 'show me recent articles' — anytime the user wants recency without a specific topic. `since_hours` narrows to a recent window (e.g. 12 for 'since this morning', 24 for 'today'); `feed_id` narrows to one source; `exclude_feed_ids` drops one or more feeds (e.g. 'what's new minus Hacker News' if HN is dominating the queue). Prefer this over search_articles_by_keyword when there's no keyword to search on. For 'what's new since I last asked' across separate conversations, prefer get_new_articles. **Topic clustering.** When the user asks to group their unread by topic, story, or theme, call this tool with `lean: true` and a high `limit` (up to 1000) to fit the entire unread set in one call. Then read the titles, identify story threads (e.g. '17 articles on the iOS 26.5 release rollout', '6 articles on the Musk-Altman trial'), and surface them. Pair with set_read_state (`read: true`, `article_ids`) to bulk-clear a thread the user has already covered elsewhere. **Engagement ranking.** Pass `boost_engaged_feeds: true` when the user wants their most-relevant news first rather than strict reverse-chronological — e.g. 'what should I read', 'what's worth my time', 'the good stuff first'. It re-orders the recent unread pool so feeds the user actually reads and stars float to the top and habitually-skipped feeds sink, with recency as the tiebreaker. Leave it off (default) for a pure newest-first timeline.
get_unread_articles
Total unread count, scoped to subscribed feeds within tier retention (Pro 30d, Max 90d). Cheap — no article data. Pass `by_feed: true` to also get per-feed breakdown (which sources are noisy). Use BEFORE get_unread_articles when only a count is needed; great for 'how many unread' and 'where are my unread'.
get_unread_count
Pull the unseen matched articles for the user's watches (from watch_hits, newest-detected first). With watch_id, runs one watch; without, runs all and groups results by watch. By default marks the returned articles as seen so the next call only shows new ones; pass mark_seen=false to peek. Use when the user asks 'what's new on my watches', 'show me the M5 Mac mini matches', or after seeing watch_summaries on get_new_articles. Each article includes matched_at (when detected) and, for semantic watches, a similarity score.
get_watch_matches
Bulk-subscribe to feeds from an OPML 2.0 document. Use when the user pastes OPML XML or names a few feeds at once. **Hard cap: 100 entries per call** — for larger imports (Feedly/Inoreader exports etc.) direct the user to https://newsmind.app/auth/account where they can upload an OPML file of any size. Idempotent: already-subscribed feeds are skipped. Returns immediately after format-validating + queueing; actual fetching runs in the background at ~10/min. Call get_import_status to track progress.
import_opml
List all RSS feeds the user is subscribed to. Returns id, title, URL, last poll time, and any error status.
get_feeds
Return the user's saved watches with scope, delivery, active state, and current unseen-match counts. Use when the user asks 'what am I watching', 'show me my watches'. Read-only — does NOT mark anything seen.
list_watches
Reorganize an existing subscription into a folder. Omit `folder` to remove the feed from any folder (top-level). Does not affect the feed's articles, subscribed_at cutoff, or unread queue.
move_feed_to_folder
File a bug report, feature request, or feedback to the Newsmind team. Use this when the user expresses frustration with how a tool worked (a discovery returned nothing they expected, an action didn't do what they intended, an error message was confusing), asks for a feature that doesn't exist, or volunteers feedback they want the developers to see. Include reproducer details: what they asked, what tool you called, what came back, what they expected. Don't include the user's API token, JWT, or any other credential — the server scrubs them defensively but reports should be clean. Returns an issue ID the user can reference if they email support.
report_issue
Full-text keyword search across all subscribed articles. Returns {articles: [...], fallback?: 'or', hint?: string, retention: {window_days, cutoff_at, cutoff_hit?}}. Articles are ranked by keyword relevance with a 14-day recency half-life — best matches first, with a mild bias toward recent articles. For newest-first ordering without a topic ('what's new today', 'show me the latest'), use get_unread_articles instead — this tool requires a non-empty query. Compound-query handling: when an AND search ('Apple battery EU AI regulation') returns no articles, the tool automatically retries with OR semantics and tags the response with fallback='or' — narrate the reduced precision to the user. The hint field is a human-readable note explaining what happened when the result set is empty or fell back. **Retention field** — `retention.window_days` is the user's tier cap (Pro: 30, Max: 90); `retention.cutoff_at` is the ISO date past which we can't see. `retention.cutoff_hit: true` appears when retention likely bounded the result set (user passed since_days > window, empty result for a multi-term query, or oldest article sits at the wall) — when present, tell the user something like "these are the matches within your plan's N-day retention window". Don't mention retention when cutoff_hit is absent. For multi-concept questions where you want both topics covered, prefer running multiple narrower queries and merging the results, or use search_articles_by_meaning if available (Max-only).
search_articles_by_keyword
Conceptual / semantic search across all subscribed articles. Use when the user asks for an idea, theme, or concept that may not match exact keywords (e.g. 'unintended consequences of AI regulation', 'companies pivoting away from open source'). Prefer over search_articles_by_keyword for compound or paraphrased questions where keyword overlap with article text is unlikely — e.g. 'GPU bottleneck' should match articles about 'AI chip supply', 'frontier safety' should match 'AGI alignment'. Returns {query, count, articles, retention: {window_days, cutoff_at, cutoff_hit?}} — articles ranked by meaning, not exact word match; never empty unless the corpus itself is empty. The retention field carries the Max 90-day cap and a cutoff_hit flag when the wall likely bounded results — relay that to the user on "go back as far as possible" style queries. Included in the Newsmind Max plan only — calls from other plans return a plan_required error; use search_articles_by_keyword instead in that case.
search_articles_by_meaning
Mark articles read or unread. `read` picks the direction (true = read, false = back to unread). Scope is EITHER `article_ids` OR `through_published_at` — pass exactly one. **By ID** — `article_ids: [1,2,3]`. Use when the user is responding to a list you just showed them: 'mark the first three', 'mark everything you just listed', or 'I read that by accident, put it back' (with `read: false`). **By high-water mark** — `through_published_at` (ISO 8601). Every subscribed article published at or before that timestamp flips. When the user says 'mark all read' or 'I'm caught up', pass the CURRENT UTC time — articles arriving later stay unread, so there's no race window. With `read: false` this is the bulk undo for 'put everything back to unread'. Add `feed_id` to scope to one source ('mark all from MacRumors as read'). Read state and stars are independent — this never touches a star.
set_read_state
Star or unstar articles (saved/favorited). `starred: true` adds the star, `starred: false` removes it. Operates on the `stars` table only — read state is untouched. Re-starring an already-starred article is a no-op and does not bump its starred_at.
set_starred
Add an RSS/Atom feed to the user's subscriptions. The feed will be polled automatically. `url` may be either the actual feed URL or a regular site/homepage URL — if the URL returns HTML, the server auto-discovers the feed — the `<link rel="alternate">` head tag first, then feed-looking or RSS-labelled links in the page body — so the user can paste e.g. https://stratechery.com/ instead of having to find the .xml URL. When auto-discovery fires, the response includes `auto_discovered: { input_url, discovered_url }` — relay this to the user ("I subscribed you to X, which I found advertised on Y"). Subscribing immediately surfaces the feed's in-retention backlog: `subscribed_at` is set to the caller's retention cutoff (30 days Pro / 90 days Max), so the unread queue shows articles already in storage rather than staying empty until the next poll. Anything older than that window stays hidden. Re-subscribing to a feed you already have is a no-op; to reorganize an existing subscription's folder, use move_feed_to_folder.
subscribe_to_feed
Remove a feed from the user's subscriptions. Does not delete shared articles. Pass the feed's numeric id (from get_feeds or any article's feed_id) when you have it; you may also pass the feed's exact title or URL and it will be resolved against the user's subscriptions. If nothing matches, the response has status 'not_found' — call get_feeds and retry rather than guessing an id.
unsubscribe_from_feed
Modify a saved watch without recreating it. Use to pause/resume (active=false/true — 'mute my M5 watch'), rename, edit the query, change scope, or switch delivery channel/cadence. Only the fields you pass are changed. Editing the query rebuilds the match set. Returns the updated watch.
update_watch
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Newsmind — RSS for your AI alternatives on ChatGPT?
As of 2026-09-08, Newsmind — RSS for your AI competes with Break The Web News, Enzo Reader for RSS Feeds, Haaretz, La Dépêche du Midi, Le Parisien, Midi Libre, Newsify, NOS, SimpleFeed News & Video MCP in ChatGPT News & Feed Reading, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.