# RSS Feed Reader (with MCP) (`fetch_cat/rss-feed-reader`) Actor

Read RSS and Atom feeds, normalize items, and send summaries or records to MCP connectors for monitoring, alerts, AI workflows, dashboards, and integrations.

- **URL**: https://apify.com/fetch\_cat/rss-feed-reader.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 feed items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## RSS Feed Reader (with MCP)

Read RSS and Atom feeds on Apify and export clean, normalized dataset rows for monitoring, alerts, AI/RAG pipelines, MCP connectors, newsletters, dashboards, and no-code automations.

### What does RSS Feed Reader do?

RSS Feed Reader fetches public RSS, Atom, and RDF feed URLs and converts feed entries into a structured Apify dataset.

It is designed for recurring jobs where you need reliable feed imports without maintaining your own parser, scheduler, exports, or integrations.

### Who is it for?

- 📰 **News monitoring teams** tracking publishers, blogs, or government feeds.
- 📈 **SEO and content marketers** watching competitor content and topic updates.
- 🤖 **AI workflow builders** feeding fresh articles into RAG, summarization, or alerting flows.
- 🧰 **Automation builders** connecting RSS feeds to Make, Zapier, Slack, Airtable, or databases.
- 🧑‍💼 **Agencies and analysts** collecting repeatable content snapshots for clients.

### Why use this actor?

- Fetch many feeds in one run.
- Normalize RSS and Atom entries into one dataset shape.
- Keep going when one feed fails.
- Add stable dedupe keys for scheduled monitoring.
- Export results through Apify datasets, API, webhooks, MCP connectors, and integrations.

### What data can it extract?

| Field | Description |
| --- | --- |
| `feedUrl` | Feed URL that produced the item |
| `feedTitle` | Feed title when available |
| `feedDescription` | Feed description or subtitle |
| `feedLink` | Website link advertised by the feed |
| `feedLanguage` | Feed language when present |
| `feedLastBuildDate` | Feed-level update date when present |
| `feedType` | RSS, Atom, or RDF parser mode |
| `title` | Feed item title |
| `description` | Item summary or description |
| `content` | Full content field when the feed provides it |
| `link` | Item URL |
| `guid` | Item GUID or ID |
| `pubDate` | Original publication date text |
| `isoDate` | Normalized ISO publication date |
| `author` | Author or creator when available |
| `categories` | Item categories or tags |
| `imageUrl` | First media/enclosure image URL |
| `mediaUrls` | Media and enclosure URLs |
| `dedupeKey` | Stable key for de-duplication |
| `fetchedAt` | Timestamp when the actor fetched the feed |
| `error` | Error message for failed feed URLs when enabled |

### How much does it cost to read RSS feeds?

This actor uses pay-per-event pricing.

- A small start event is charged once per run.
- A result event is charged for each normalized feed item or error row saved.
- Exact pricing is visible on the Apify Store pricing tab before you run the actor.

RSS parsing is lightweight, so typical runs are inexpensive. Keep `maxItemsPerFeed` low for test runs, then increase it for production schedules.

### Quick start

1. Open the actor on Apify.
2. Add one or more RSS or Atom feed URLs.
3. Choose the maximum number of items per feed.
4. Run the actor.
5. Export the dataset as JSON, CSV, Excel, RSS, or through the Apify API.

### Example input

```json
{
  "feedUrls": [
    { "url": "https://feeds.bbci.co.uk/news/rss.xml" },
    { "url": "https://www.nasa.gov/news-release/feed/" }
  ],
  "maxItemsPerFeed": 20,
  "includeContent": true,
  "includeFeedMetadata": true,
  "dedupeBy": "guid",
  "requestTimeoutSecs": 20,
  "emitErrorItems": true,
  "mcpMode": "off",
  "maxMcpRecords": 20
}
````

### Input options

#### feedUrls

Add one or more public RSS, Atom, or RDF feed URLs.

#### maxItemsPerFeed

Controls how many entries are saved from each feed. Use a low number for first runs and larger values for production imports.

#### includeContent

When enabled, the actor includes full content fields such as `content:encoded` or Atom content if available.

#### includeFeedMetadata

When enabled, each row includes feed-level title, description, website link, language, and update date when present.

#### dedupeBy

Choose how duplicate entries are detected across all feeds in the same run:

- `guid` — recommended for most feeds.
- `link` — useful when feeds have unreliable IDs.
- `titleAndDate` — useful for feeds that omit both GUID and stable links.

#### requestTimeoutSecs

Sets the timeout for each feed URL. Slow or unreachable feeds can be recorded as error rows while other feeds continue.

#### emitErrorItems

When enabled, failed feed URLs produce dataset rows with the `error` field populated. This is useful for scheduled alerts.

#### mcpConnectors

Optional Apify MCP connector resources that can receive a run digest after the dataset is saved. Use this when you want the actor to send feed-monitoring results directly to a connected destination such as Slack, Notion, Supabase, or another MCP-compatible tool.

#### mcpMode

Controls MCP delivery. Keep `off` for dataset-only runs, choose `sendSummary` to send feed counts and run context, or choose `sendRecords` to include capped sample feed items.

#### mcpInstruction

A short natural-language instruction for the selected connector, such as `Send a concise RSS digest to #news-monitoring`. Do not paste API keys or third-party credentials here.

#### maxMcpRecords

Limits how many saved feed rows are included in MCP delivery when `mcpMode` is `sendRecords`. The full dataset remains available even when the MCP digest is capped.

### Example output

```json
{
  "feedUrl": "https://feeds.bbci.co.uk/news/rss.xml",
  "feedType": "rss",
  "feedTitle": "BBC News",
  "title": "Example headline",
  "description": "Short item summary",
  "content": "Longer content when provided by the feed",
  "link": "https://www.bbc.com/news/example",
  "guid": "https://www.bbc.com/news/example",
  "pubDate": "Fri, 26 Jun 2026 10:00:00 GMT",
  "isoDate": "2026-06-26T10:00:00.000Z",
  "author": null,
  "categories": ["World"],
  "imageUrl": "https://example.com/image.jpg",
  "mediaUrls": ["https://example.com/image.jpg"],
  "fetchedAt": "2026-06-26T13:00:00.000Z",
  "dedupeKey": "guid:https://www.bbc.com/news/example"
}
```

### Tips for best results

- ✅ Use direct feed URLs, not regular website homepages.
- ✅ Start with 10–20 items per feed for testing.
- ✅ Use scheduled runs for monitoring workflows.
- ✅ Keep `emitErrorItems` enabled if downstream automations need to know when a feed fails.
- ✅ Use `dedupeKey` in your database or automation tool to avoid duplicate alerts.

### Scheduling and monitoring

RSS Feed Reader works well with Apify schedules.

For example:

- Run every 15 minutes for breaking news feeds.
- Run hourly for blogs and product changelogs.
- Run daily for research feeds and newsletters.

Use the dataset, webhook, or API output to trigger downstream actions.

### Integrations

You can connect results to:

- Slack alerts for new headlines.
- MCP connectors for Slack, Notion, Supabase, or custom tools.
- Airtable or Google Sheets content trackers.
- Make or Zapier workflows.
- Vector database ingestion jobs.
- Newsletter drafting pipelines.
- Internal monitoring dashboards.

### API usage with Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/rss-feed-reader').call({
  feedUrls: [{ url: 'https://feeds.bbci.co.uk/news/rss.xml' }],
  maxItemsPerFeed: 10
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/rss-feed-reader').call(run_input={
    'feedUrls': [{'url': 'https://feeds.bbci.co.uk/news/rss.xml'}],
    'maxItemsPerFeed': 10,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage with cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~rss-feed-reader/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"feedUrls":[{"url":"https://feeds.bbci.co.uk/news/rss.xml"}],"maxItemsPerFeed":10}'
```

### MCP usage

RSS Feed Reader (with MCP) supports two MCP workflows:

1. **Run the actor from an MCP client** such as Claude Desktop or Claude Code through Apify MCP.
2. **Deliver results to MCP connectors** after the feed dataset is saved by setting `mcpConnectors`, `mcpMode`, `mcpInstruction`, and `maxMcpRecords` in the actor input.

MCP delivery is safe-by-default: it is off unless you select connectors, it never asks for third-party credentials in the input, and it only calls send/post/write/create/insert/append/log-style tools discovered on the connector. Delivery status is stored in the `MCP_DELIVERY_STATUS` key-value store record.

MCP server URL:

```text
https://mcp.apify.com/?tools=fetch_cat/rss-feed-reader
```

Claude Code setup:

```bash
claude mcp add apify-rss-feed-reader https://mcp.apify.com/?tools=fetch_cat/rss-feed-reader
```

Claude Desktop JSON configuration:

```json
{
  "mcpServers": {
    "apify-rss-feed-reader": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/rss-feed-reader"
    }
  }
}
```

Example prompts:

- "Read these RSS feeds and summarize the newest five posts."
- "Monitor this changelog feed and tell me what changed since yesterday."
- "Fetch these news feeds and prepare a table of titles, URLs, and publish dates."

Example MCP connector input:

```json
{
  "feedUrls": [{ "url": "https://feeds.bbci.co.uk/news/rss.xml" }],
  "maxItemsPerFeed": 10,
  "mcpConnectors": ["your-connector-resource-id"],
  "mcpMode": "sendRecords",
  "mcpInstruction": "Send a concise RSS digest to #news-monitoring.",
  "maxMcpRecords": 10
}
```

### Common workflows

#### News alerting

Run the actor on a schedule, filter rows by keyword, and send matches to Slack or email.

#### AI/RAG ingestion

Fetch feed entries, deduplicate by `dedupeKey`, then send new links and content to your embedding pipeline.

#### Competitor content tracking

Track competitor blog feeds and export the dataset to a spreadsheet or CRM.

#### Newsletter research

Collect article titles, summaries, links, and publication dates for editorial review.

### FAQ

#### Can this actor read both RSS and Atom feeds?

Yes. Add public RSS, Atom, or RDF feed URLs in the input and the actor normalizes entries into the same dataset shape.

#### Does it crawl the full article pages?

No. It reads the feed entries only. Some publishers include full content in the feed; others include summaries and links.

### Troubleshooting

#### Why did a feed return an error row?

The feed URL may be unreachable, blocked, malformed, or not a real RSS/Atom feed. Open the feed URL in a browser and check whether it returns XML.

#### Why are some fields empty?

RSS and Atom publishers choose which fields to include. Some feeds omit authors, categories, images, or full content.

#### Why do I see duplicates across scheduled runs?

Scheduled runs create new datasets. Store `dedupeKey` in your downstream system and skip rows you have already processed.

### Legality and responsible use

This actor is intended for public RSS and Atom feed URLs. Make sure your use complies with each publisher's terms, copyright rules, and applicable laws. Do not use the actor to access private, paid, or unauthorized feeds.

### Related scrapers

You may also find these Apify actors useful:

- Google News Scraper: `https://apify.com/fetch_cat/google-news-scraper`
- Google Trending Searches Scraper: `https://apify.com/fetch_cat/google-trending-searches-scraper`
- Substack Posts Scraper: `https://apify.com/fetch_cat/substack-posts-scraper`

### Limits

- The actor only reads public feed URLs supplied in the input.
- It does not crawl full websites behind each item link.
- It does not bypass logins, paywalls, or private feeds.
- Very large feeds should be capped with `maxItemsPerFeed`.

### Changelog

#### 0.1

Initial version with RSS, Atom, RDF parsing, multi-feed input, feed metadata, media URL extraction, dedupe keys, and optional error rows.

# Actor input Schema

## `feedUrls` (type: `array`):

Public RSS, Atom, or RDF feed URLs to fetch. Add one feed per row.

## `maxItemsPerFeed` (type: `integer`):

Maximum number of entries to save from each feed URL.

## `includeContent` (type: `boolean`):

Include content:encoded or Atom content when the feed provides it. Disable for smaller output rows.

## `includeFeedMetadata` (type: `boolean`):

Add feed title, feed description, feed link, language, and last build date to every item row when available.

## `dedupeBy` (type: `string`):

How duplicate entries should be detected across all feeds in the run.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for each feed URL before recording an error and continuing with the next feed.

## `emitErrorItems` (type: `boolean`):

When enabled, failed feed URLs are saved as dataset rows with the error field populated so scheduled workflows can alert on failures.

## `mcpConnectors` (type: `array`):

Connector(s) this Actor may use after reading feeds, such as Slack, Notion, Supabase, or another MCP-compatible destination. The actor discovers tools at runtime and only calls safe send/post/write/create/insert/append/log-style tools.

## `mcpMode` (type: `string`):

Off by default. Choose Summary to send only a compact feed-run digest, or Records to include capped sample feed items after saving the dataset.

## `mcpInstruction` (type: `string`):

Short instruction for the selected connector, for example: Send a digest to #news-monitoring. Do not paste API keys or third-party credentials here.

## `maxMcpRecords` (type: `integer`):

Maximum number of feed rows included when MCP delivery mode sends records. The full dataset remains available separately.

## Actor input object example

```json
{
  "feedUrls": [
    {
      "url": "https://feeds.bbci.co.uk/news/rss.xml"
    },
    {
      "url": "https://www.nasa.gov/news-release/feed/"
    }
  ],
  "maxItemsPerFeed": 20,
  "includeContent": true,
  "includeFeedMetadata": true,
  "dedupeBy": "guid",
  "requestTimeoutSecs": 20,
  "emitErrorItems": true,
  "mcpMode": "off",
  "mcpInstruction": "Send a concise RSS digest to #news-monitoring.",
  "maxMcpRecords": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "feedUrls": [
        {
            "url": "https://feeds.bbci.co.uk/news/rss.xml"
        },
        {
            "url": "https://www.nasa.gov/news-release/feed/"
        }
    ],
    "maxItemsPerFeed": 20,
    "includeContent": true,
    "includeFeedMetadata": true,
    "dedupeBy": "guid",
    "requestTimeoutSecs": 20,
    "emitErrorItems": true,
    "mcpInstruction": "Send a concise RSS digest to #news-monitoring."
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/rss-feed-reader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "feedUrls": [
        { "url": "https://feeds.bbci.co.uk/news/rss.xml" },
        { "url": "https://www.nasa.gov/news-release/feed/" },
    ],
    "maxItemsPerFeed": 20,
    "includeContent": True,
    "includeFeedMetadata": True,
    "dedupeBy": "guid",
    "requestTimeoutSecs": 20,
    "emitErrorItems": True,
    "mcpInstruction": "Send a concise RSS digest to #news-monitoring.",
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/rss-feed-reader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "feedUrls": [
    {
      "url": "https://feeds.bbci.co.uk/news/rss.xml"
    },
    {
      "url": "https://www.nasa.gov/news-release/feed/"
    }
  ],
  "maxItemsPerFeed": 20,
  "includeContent": true,
  "includeFeedMetadata": true,
  "dedupeBy": "guid",
  "requestTimeoutSecs": 20,
  "emitErrorItems": true,
  "mcpInstruction": "Send a concise RSS digest to #news-monitoring."
}' |
apify call fetch_cat/rss-feed-reader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fetch_cat/rss-feed-reader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RSS Feed Reader (with MCP)",
        "description": "Read RSS and Atom feeds, normalize items, and send summaries or records to MCP connectors for monitoring, alerts, AI workflows, dashboards, and integrations.",
        "version": "0.1",
        "x-build-id": "Wlw6IbR1cEqp0t0Y3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fetch_cat~rss-feed-reader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fetch_cat-rss-feed-reader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/fetch_cat~rss-feed-reader/runs": {
            "post": {
                "operationId": "runs-sync-fetch_cat-rss-feed-reader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/fetch_cat~rss-feed-reader/run-sync": {
            "post": {
                "operationId": "run-sync-fetch_cat-rss-feed-reader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "feedUrls"
                ],
                "properties": {
                    "feedUrls": {
                        "title": "RSS or Atom feed URLs",
                        "type": "array",
                        "description": "Public RSS, Atom, or RDF feed URLs to fetch. Add one feed per row.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItemsPerFeed": {
                        "title": "Maximum items per feed",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of entries to save from each feed URL.",
                        "default": 20
                    },
                    "includeContent": {
                        "title": "Include full content fields",
                        "type": "boolean",
                        "description": "Include content:encoded or Atom content when the feed provides it. Disable for smaller output rows.",
                        "default": true
                    },
                    "includeFeedMetadata": {
                        "title": "Include feed metadata",
                        "type": "boolean",
                        "description": "Add feed title, feed description, feed link, language, and last build date to every item row when available.",
                        "default": true
                    },
                    "dedupeBy": {
                        "title": "Deduplicate by",
                        "enum": [
                            "guid",
                            "link",
                            "titleAndDate"
                        ],
                        "type": "string",
                        "description": "How duplicate entries should be detected across all feeds in the run.",
                        "default": "guid"
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout in seconds",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "How long to wait for each feed URL before recording an error and continuing with the next feed.",
                        "default": 20
                    },
                    "emitErrorItems": {
                        "title": "Save failed feeds as error rows",
                        "type": "boolean",
                        "description": "When enabled, failed feed URLs are saved as dataset rows with the error field populated so scheduled workflows can alert on failures.",
                        "default": true
                    },
                    "mcpConnectors": {
                        "title": "MCP connectors",
                        "minItems": 0,
                        "maxItems": 3,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Connector(s) this Actor may use after reading feeds, such as Slack, Notion, Supabase, or another MCP-compatible destination. The actor discovers tools at runtime and only calls safe send/post/write/create/insert/append/log-style tools."
                    },
                    "mcpMode": {
                        "title": "MCP delivery mode",
                        "enum": [
                            "off",
                            "sendSummary",
                            "sendRecords"
                        ],
                        "type": "string",
                        "description": "Off by default. Choose Summary to send only a compact feed-run digest, or Records to include capped sample feed items after saving the dataset.",
                        "default": "off"
                    },
                    "mcpInstruction": {
                        "title": "MCP delivery instruction",
                        "maxLength": 500,
                        "type": "string",
                        "description": "Short instruction for the selected connector, for example: Send a digest to #news-monitoring. Do not paste API keys or third-party credentials here."
                    },
                    "maxMcpRecords": {
                        "title": "Maximum MCP records",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of feed rows included when MCP delivery mode sends records. The full dataset remains available separately.",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
