RSS Digest
The pack's one tool-providing skill. Every other starter skill is a
procedure over tools the agent already has; this one ships its own code in
tools.py and registers it as rss-digest/fetch_rss.
It exists to show the shape: a manifest entry per @tool function, matching the
signature exactly, plus the network:read permission the tool actually uses.
Procedure
- Fetch the feed with
rss-digest/fetch_rss(url, max_entries=10). It returns{"feed_title": ..., "entries": [{"title", "link", "published", "summary"}], "count": N}in feed order — conventionally newest first, but the feed decides, so read thepublishedvalues rather than assuming. - If the call returns an
errorkey, report it verbatim. A malformed feed, a 404, a blocked host, a feed with no recognizable entries, and a feed carrying a DTD are all real answers; an invented digest is not. - Digest the entries. One line per entry: what it is and why it might matter, with its link. Group by theme when more than five entries share one.
- Lead with the exception. If one entry is materially different from the usual traffic on this feed — a breaking change, a security release, a shutdown notice — put it first and label it.
- Say the range you covered — feed title, entry count, and the oldest date included — so the user knows what was and was not read.
Notes
- The tool follows GAIA's
WebClient, so private and loopback addresses are refused. Point it at a public feed. - Feeds declaring a DTD are refused rather than parsed: entity expansion is a denial-of-service vector, and no real feed needs one.
- RSS 1.0 / RDF feeds are not supported and report an error rather than an empty digest — "nothing published" and "I could not read this" must never look alike.
- Entry summaries in feeds are frequently truncated or HTML-laden. Treat them as a headline, not the article; say so rather than over-reading a stub.
Fork this
Copy the directory and edit tools.py — that is the whole point of a tool
skill. Parse a JSON API instead of XML, or add a since parameter for
date-bounded fetches. Whatever you change in the signature, mirror in
metadata.gaia.tools: the loader compares them and refuses the skill if they
disagree, so a stale manifest can never ship.


