Give your agent a feed layer
emit is a programmable RSS service with a hosted MCP server. Point any MCP-aware client at one URL and your agent can create filtered feeds, watch pages that have no feed, send email newsletters from your own domain, and push items into Slack or Discord — using the same API key, auth, and rate limits as a direct REST call.
There is no package to install and nothing to run locally. The server is a URL.
Connect
The endpoint is https://api.rssemit.com/mcp. It speaks the Model Context
Protocol over Streamable HTTP, and it authenticates with your emit API key as a bearer token
— the same key you would use against the REST API.
Claude Code
claude mcp add --transport http emit https://api.rssemit.com/mcp \
--header "Authorization: Bearer $EMIT_API_KEY"
Clients that accept an HTTP mcpServers block — use this in
your client's MCP configuration:
{
"mcpServers": {
"emit": {
"type": "http",
"url": "https://api.rssemit.com/mcp",
"headers": { "Authorization": "Bearer emit_live_…" }
}
}
}
Where that file lives differs per client; check your client's own MCP documentation for the path. Other clients use different formats; follow their HTTP transport and bearer-header instructions.
No key yet? You don't need a signup form. Ask your agent to call
create_account with a name and an email and it will get one back — the key is
returned once, so store it as EMIT_API_KEY immediately.
Once connected, tools/list returns 33 tools. Everything below is one of them.
The one-prompt quickstart
Paste this at your agent and it will do the whole thing:
Use the emit MCP server to set me up:
1. Create an emit account for me and save the API key as EMIT_API_KEY.
2. Create a feed for security advisories and breaking changes affecting
Postgres, Redis, and nginx.
3. Show me the feed's Atom URL so I can subscribe in my reader.
4. Register my sending domain and walk me through the DNS records, then
turn the feed into a daily email digest from digest@<my-domain>.
5. Start a $10 top-up so filtering and sending are funded, then refresh
the feed and show me what it caught.
What happens under the hood: create_account issues the key,
create_feed discovers sources from the prompt and returns durable
atom_url / json_url endpoints, verify_domain returns
the exact DKIM, SPF, and DMARC records to add, broadcast_feed_by_email turns
the feed into a daily email digest, top_up returns a Stripe Checkout URL, and
refresh_feed polls immediately instead of waiting for the cadence.
Only one step is yours: opening the Checkout URL. New accounts start at a zero balance, and nothing sends until it is funded.
What the tools call things
This is worth two minutes before you read the tool list, because the MCP surface deliberately uses friendlier names than the REST API does. If you have the API reference open in another tab, the words do not line up:
| The MCP tools say | The REST API and docs call it | REST path |
|---|---|---|
| feed — a stream you curate and filter | a watcher (also "smart feed") | /v1/watchers |
| email broadcast — a newsletter people subscribe to | a feed | /v1/feeds |
| chat broadcast — a Slack or Discord destination | a sink | /v1/sinks |
So create_feed posts to /v1/watchers, and
create_email_broadcast posts to /v1/feeds. The overlap on the word
"feed" is the one that bites: an MCP feed is a REST watcher, and an MCP
email broadcast is a REST feed.
The MCP names describe what the object does for you; the REST names are the internal model.
Nothing is translated at the data layer — a feed you create over MCP is the same object you
can GET /v1/watchers/{id} a second later.
The tools
Account and billing — create_account, account,
verify_domain, top_up
Create an account and get a key, read your credit balance and verification state, register a sending domain and receive its DNS records, and start a prepaid top-up.
Feeds (anything in, one clean stream out) — create_feed,
list_feeds, get_feed, update_feed,
delete_feed, add_feed_source, remove_feed_source,
feed_items, preview_feed, refresh_feed
Describe an interest in plain language and let it find sources, or pass source URLs yourself
— RSS/Atom feeds, or pages with no feed at all, which are watched by diffing their links.
With no prompt you get a plain merge. preview_feed dry-runs the filter over
recent items and shows what would be kept versus dropped, with scores, without changing what
the feed publishes; it is the right way to tune a prompt or threshold before committing to
it.
Email broadcasts — broadcast_feed_by_email,
create_email_broadcast, list_email_broadcasts,
update_email_broadcast, delete_email_broadcast,
broadcast_subscribers, invite_subscribers
Turn one of your feeds into a newsletter in a single call, or point a broadcast at any
RSS/Atom URL directly — yours or anyone's. Schedules are on_publish,
daily, or weekly. Mail goes out from your own verified domain.
Chat broadcasts — broadcast_feed_to_chat,
preview_chat_broadcast, list_chat_broadcasts,
update_chat_broadcast, delete_chat_broadcast
Push a feed's new items to a Slack or Discord incoming webhook, either per item as it lands
or rolled up on a daily/weekly schedule. preview_chat_broadcast posts one
message so you can see how it reads, and returns the exact text it posted, without changing
what the live broadcast will later push.
Subscribers — add_subscriber, list_subscribers,
update_subscriber, remove_subscriber,
import_subscribers
Add people one at a time or bulk-import a list. Subscribers are double opt-in: they stay
pending until they click the confirmation link. Consent is scoped per
broadcast, so invite_subscribers is how you ask a pre-added list to confirm.
Reading and one-offs — read_items,
send_one_off_email
Read recent items across everything you run, newest first — useful when the agent is the
reader. send_one_off_email sends a single email to confirmed subscribers
without setting up a recurring broadcast.
The server runs inside the API
Every tool call executes against your account using the key in your
Authorization header, and is subject to the same validation, rate limits, and
error responses as the equivalent REST call. Your subscribers' data is not proxied through a
third party, and there is no client package to keep updated — when a tool changes, the
endpoint changes with it.
The tool input schemas are generated from the same request models the REST API validates against, so what a tool accepts and what the endpoint accepts do not drift apart.
Or skip MCP: the Claude Code skill
If you would rather not register a server, there is a single static skill file:
mkdir -p ~/.claude/skills/emit
curl -fsSL https://rssemit.com/skill.md -o ~/.claude/skills/emit/SKILL.md
# then, in any repo:
claude "add a newsletter to this blog using emit"
It teaches the agent to find the RSS feed in your repo, verify your sending domain, import subscribers, and send the first broadcast, using plain REST calls.
There is also an llms.txt describing
the whole product to agents, and the complete
OpenAPI 3.1 spec as one file.
The same thing in four curl calls
MCP is a convenience, not a requirement. Nothing above is unavailable over plain HTTP:
curl -sX POST https://api.rssemit.com/v1/accounts \
-H "Content-Type: application/json" \
-d '{"name":"Ops feeds","email":"you@yourdomain.dev"}'
# → save .api_key as EMIT_API_KEY (shown once)
curl -sX POST https://api.rssemit.com/v1/watchers \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $EMIT_API_KEY" \
-d '{"prompt":"security advisories and breaking changes affecting
Postgres, Redis, and nginx"}'
# → .atom_url is your feed; .id is $FEED
curl -sX POST https://api.rssemit.com/v1/domains \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $EMIT_API_KEY" -d '{"domain":"yourdomain.dev"}'
# → add the returned DNS records, then POST /v1/domains/{id}/verify
curl -sX POST https://api.rssemit.com/v1/watchers/$FEED/pipe \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $EMIT_API_KEY" \
-d '{"from_email":"digest@yourdomain.dev","schedule":"daily"}'
What it costs
Creating feeds, serving them, polling, sinks, and outbound webhooks are free. The meter runs on work actually done, from one prepaid balance at $1.60 per 1,000 credits, $10 minimum top-up, no monthly fee and no subscriber tiers:
- 1 credit per email sent
- 1 credit per 5 items the LLM filter judges
- 1 credit per item summarized
- 25 credits to re-run source discovery
A feed filtering roughly 40 items a day costs about $0.38 a month. A 5,000-subscriber blog publishing four times a month is about $32 a month.
Things to tell your agent
-
Fund before you send. New accounts start at zero.
top_upreturns a Stripe Checkout URL; a human has to open it. - Never print or commit the API key. It is shown once, at account creation. Store it in the environment.
-
Subscribers are double opt-in. An imported list stays
pendinguntil each person confirms, unless it opted in elsewhere and you import it as confirmed. - Filtering is auditable. Every item carries a relevance score and a one-line reason, and suppressed items are kept so you can ask why something didn't appear.
Get an API key → · Read the API guide · Zero to a working pipeline with any agent