skillZs
★ LIVE SKILL TAGS ★
>>> LIVE SKILLS INDEX <<<
* OPEN SOURCE *
NO LOGIN, NO TRACKING
※ REAL INSTALL DATA ※
← back to all skills
winsorllc/upgraded-carnival109 installs

rss-monitor

Monitor RSS/Atom feeds and blogs for new content using feedparser.

How do I install this agent skill?

npx skills add https://github.com/winsorllc/upgraded-carnival --skill rss-monitor
view source ↗

Is this agent skill safe to install?

  • Gen Agent Trust Hubpass

    The skill is safe for its intended use of monitoring RSS feeds, but it performs network operations to external domains and presents a surface for indirect prompt injection from untrusted feed content.

  • Socketpass

    No alerts

  • Snykwarn

    Risk: MEDIUM · No issues

  • ZeroLeakspass

    Score: 93/100 · 2 sections analyzed

What does this agent skill do?

RSS Monitor

Track RSS and Atom feeds for new content.

Installation

npm install feedparser

Quick Start

Basic Feed Fetch

const { fetchFeed } = require('./rss-monitor');

const items = await fetchFeed('https://example.com/feed.xml');
console.log(items); // Array of feed items

Track Multiple Feeds

const { trackFeeds } = require('./rss-monitor');

const feeds = [
  { url: 'https://blog1.com/rss', name: 'Blog 1' },
  { url: 'https://blog2.com/atom.xml', name: 'Blog 2' }
];

const results = await trackFeeds(feeds);
console.log(results);

Check for New Items

const { checkForNewItems } = require('./rss-monitor');

const lastCheck = new Date('2024-01-01T00:00:00Z');
const newItems = await checkForNewItems('https://example.com/feed.xml', lastCheck);
console.log(`Found ${newItems.length} new items`);

Common Operations

Fetch Latest Items

const items = await fetchFeed('https://xkcd.com/atom.xml', { limit: 10 });

Get Feed Metadata

const feed = await fetchFeedMetadata('https://example.com/feed.xml');
console.log(feed.title, feed.link, feed.description);

Parse Feed with Options

const items = await fetchFeed('https://example.com/feed.xml', {
  limit: 20,
  includeContent: false,
  timeout: 5000
});

Compare with Previous Check

const newItems = await checkForNewItems(
  'https://example.com/feed.xml',
  lastCheckDate,
  { limit: 50 }
);

Output Format

Each feed item contains:

  • title - Item title
  • link - Item URL
  • description - Item summary/description
  • pubDate - Publication date (ISO string)
  • author - Author name (if available)
  • content - Full content (if available and includeContent: true)
  • categories - Tags/categories
  • enclosures - Media attachments (images, audio, video)

Examples

RSS Feed Reader

const rssMonitor = require('./rss-monitor');

async function readFeeds() {
  const feeds = [
    'https://xkcd.com/atom.xml',
    'https://blog.github.com/feed/',
    'https://news.ycombinator.com/rss'
  ];
  
  for (const feedUrl of feeds) {
    try {
      const items = await rssMonitor.fetchFeed(feedUrl, { limit: 5 });
      console.log(`\n📰 ${feedUrl}`);
      items.forEach(item => {
        console.log(`  • ${item.title}`);
        console.log(`    ${item.link}`);
      });
    } catch (err) {
      console.error(`Failed to fetch ${feedUrl}:`, err.message);
    }
  }
}

Monitor for New Content

const rssMonitor = require('./rss-monitor');
const fs = require('fs').promises;

const STATE_FILE = './last-check.json';

async function monitorFeeds() {
  // Load last check times
  let lastChecks = {};
  try {
    lastChecks = JSON.parse(await fs.readFile(STATE_FILE, 'utf8'));
  } catch (e) {
    // No state file yet
  }
  
  const feeds = [
    { url: 'https://xkcd.com/atom.xml', name: 'XKCD' },
    { url: 'https://blog.github.com/feed/', name: 'GitHub Blog' }
  ];
  
  for (const feed of feeds) {
    const lastCheck = lastChecks[feed.url] ? new Date(lastChecks[feed.url]) : null;
    const newItems = await rssMonitor.checkForNewItems(feed.url, lastCheck);
    
    if (newItems.length > 0) {
      console.log(`\n🆕 ${feed.name}: ${newItems.length} new items`);
      newItems.forEach(item => {
        console.log(`  • ${item.title}`);
      });
    }
    
    lastChecks[feed.url] = new Date().toISOString();
  }
  
  await fs.writeFile(STATE_FILE, JSON.stringify(lastChecks, null, 2));
}

Notes

  • Supports both RSS 2.0 and Atom 1.0 formats
  • Automatically detects feed format
  • Handles redirects and common feed variations
  • Default timeout: 10 seconds
  • Items sorted by publication date (newest first)

Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.

<a href="https://skillzs.dev/skills/winsorllc/upgraded-carnival/rss-monitor">View rss-monitor on skillZs</a>