Content Fetcher MCP
Fetches releases from the Block/Goose GitHub repository, allowing tracking of new releases and marking them as seen.
Fetches blog posts from any RSS feed URL, enabling content tracking and identification of new posts across RSS-enabled sites.
Fetches videos from YouTube channels, with built-in support for tracking and identifying new video content.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Content Fetcher MCPfetch new YouTube videos from Goose channel"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Content Fetcher MCP
This MCP server fetches content from various sources including YouTube, RSS feeds, and GitHub releases. It's designed to work with Goose to help track and identify new content.
Features
YouTube: Fetches videos from the Goose YouTube channel
RSS Feeds: Fetches blog posts from any RSS feed (including the Goose blog)
GitHub Releases: Fetches releases from the Block/Goose repository
Content Tracking: Tracks seen content to identify new items
Cross-machine Persistence: Stores tracking data in
~/.config/goose/content-fetcher-mcp/
Related MCP server: mcp-morning-brief
Setup
Ensure you have Node.js installed (version 14 or higher recommended).
Install dependencies:
npm installBuild the project:
npm run build
Running the MCP Server
This is an MCP server that uses stdio transport and is designed to be registered with Goose.
To start the server directly:
npm startFor development with auto-reload:
npm run devRegistering with Goose
To register this MCP server with Goose, add it to your Goose configuration. The server uses stdio transport, so it should be configured as a local MCP server in your Goose settings.
Available Tools
1. fetchYoutube
Fetches ALL videos from the Goose YouTube channel.
Parameters: None
Returns: Array of video objects with id, title, url, published_at, and type: "video"
2. fetchRss
Fetches ALL blog posts from any RSS feed.
Parameters:
url(string): RSS feed URL
Returns: Array of blog post objects with id, title, url, published_at, and type: "blog"
3. fetchGooseBlog
Fetches ALL blog posts from the official Goose blog.
Parameters: None
Returns: Array of blog post objects with id, title, url, published_at, and type: "blog"
4. fetchGithubReleases
Fetches ALL releases from the Block/Goose GitHub repository.
Parameters: None
Returns: Array of release objects with id, title, url, published_at, and type: "release"
5. isNewContent
Checks if a content item has been seen before.
Parameters:
id(string): Unique identifier for the contenttype(enum): One of"youtube","blog", or"release"
Returns: { "is_new": true/false }
6. markContentSeen
Marks a content item as seen (typically after posting).
Parameters:
id(string): Unique identifier for the contenttype(enum): One of"youtube","blog", or"release"
Returns: { "success": true }
How It Works
Fetching: The fetch tools retrieve all available content from their respective sources
Filtering: Use
isNewContentto check if an item hasn't been seen beforeTracking: After processing new content, use
markContentSeento mark it as seenPersistence: Seen content is stored in
~/.config/goose/content-fetcher-mcp/last_seen.json
Example Workflow
// 1. Fetch all YouTube videos
const videos = await fetchYoutube();
// 2. Check which ones are new
for (const video of videos) {
const result = await isNewContent({ id: video.id, type: "youtube" });
if (result.is_new) {
// Process the new video...
// 3. Mark as seen after processing
await markContentSeen({ id: video.id, type: "youtube" });
}
}Configuration
The server is pre-configured with:
YouTube Channel: Goose channel (
UCVLuT_AS687XAJ__-COCRFw)Goose Blog RSS:
https://block.github.io/goose/blog/rss.xmlGitHub Repository:
block/goose
To customize these, edit the constants in src/server.ts.
Notes
The server uses stdio transport, making it suitable for local MCP integration with Goose
Content tracking is persistent across restarts via the
last_seen.jsonfileAll fetch operations return the complete list of content; filtering for "new" items is done separately via
isNewContent
Future Improvements
Add configuration file support for customizing channels, feeds, and repositories
Implement rate limiting and caching to optimize API usage
Add more detailed logging and error handling
Support for additional content sources
Batch operations for checking multiple items at once
Available Tools
6 toolsfetchGithubReleasesB
Fetch ALL GitHub releases from the Goose repo.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states 'Fetch ALL GitHub releases', which implies a read-only operation, but doesn't clarify aspects like rate limits, authentication needs, error handling, or what 'ALL' entails (e.g., pagination, date ranges). This leaves significant gaps in understanding how the tool behaves in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It's front-loaded with the core action and resource, making it easy to parse quickly. Every part of the sentence contributes directly to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is adequate but has clear gaps. It explains what the tool does but lacks behavioral details (e.g., how releases are returned, error cases). Without annotations or an output schema, the description should do more to cover these aspects for a complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, meaning no parameters are documented in the schema. The description doesn't add parameter details, which is appropriate since there are none to describe. This meets the baseline for tools with zero parameters, as there's nothing to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch') and resource ('GitHub releases from the Goose repo'), making the purpose understandable. However, it doesn't explicitly differentiate from sibling tools like 'fetchGooseBlog' or 'fetchRss', which might also fetch content from different sources. The specificity about 'ALL' releases adds some distinction but not enough for full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'fetchGooseBlog' or 'fetchRss'. It mentions 'ALL' releases, which implies completeness, but doesn't specify context, prerequisites, or exclusions. Without any usage instructions, the agent must infer when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchGooseBlogB
Fetch ALL Goose blog posts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states 'Fetch ALL' but doesn't clarify whether this is a read-only operation, how it handles errors, if there are rate limits, or what the return format looks like. This leaves significant gaps for a tool that presumably retrieves data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded with the core action and resource, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and no output schema, the description is incomplete. It doesn't explain what 'Fetch ALL' entails (e.g., pagination, format of returned posts) or address behavioral aspects like error handling. Given the lack of structured data, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, earning a high baseline score for not adding unnecessary information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch') and resource ('ALL Goose blog posts'), making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling tools like 'fetchRss' or 'fetchYoutube' that might also fetch content, so it misses the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'fetchRss' or 'isNewContent'. It lacks context about prerequisites, timing, or exclusions, leaving the agent with minimal usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchRssC
Fetch ALL blog posts from any RSS feed.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | RSS feed URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool fetches ALL blog posts but doesn't describe return format, pagination, rate limits, error handling, or authentication needs. This leaves significant gaps for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's appropriately sized and front-loaded, clearly stating the tool's core functionality without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., list of posts, raw XML), error conditions, or behavioral traits like rate limits. For a tool with zero structured coverage, this leaves the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single 'url' parameter. The description adds no additional meaning beyond what the schema provides, such as URL format examples or constraints. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('fetch') and resource ('ALL blog posts from any RSS feed'). It distinguishes from some siblings by specifying RSS feeds rather than GitHub releases, GooseBlog, or YouTube content, though it doesn't explicitly differentiate from isNewContent or markContentSeen.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to prefer fetchRss over fetchGithubReleases, fetchGooseBlog, or fetchYoutube, nor does it indicate any prerequisites or exclusions for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchYoutubeB
Fetch ALL YouTube videos from the Goose channel.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions fetching 'ALL' videos, implying a comprehensive retrieval, but lacks details on rate limits, authentication needs, pagination, or what the return format looks like (e.g., list of videos, metadata). This leaves significant gaps for an agent to understand how to handle the tool effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any unnecessary words. It is front-loaded and wastes no space, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete for a tool that fetches content. It doesn't explain what is returned (e.g., video details, links, or raw data), potential errors, or behavioral aspects like rate limits. For a content retrieval tool with no structured support, this leaves the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description adds no parameter information, which is acceptable here as there are no parameters to describe, aligning with the baseline expectation for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch') and target resource ('ALL YouTube videos from the Goose channel'), making the purpose specific and understandable. However, it doesn't explicitly differentiate from sibling tools like 'fetchRss' or 'fetchGithubReleases', which might also retrieve content from different sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as 'fetchRss' or 'fetchGooseBlog', nor does it mention any prerequisites or exclusions. It simply states what the tool does without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
isNewContentC
Return true if this content item has NOT been seen before.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool returns a boolean based on novelty, but doesn't explain how novelty is determined (e.g., based on a database, cache, or session), what 'seen before' means, or any side effects. For a tool with no annotations, this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero waste. It's front-loaded and efficiently conveys the core purpose without unnecessary details, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (checking novelty with 2 parameters), no annotations, no output schema, and 0% schema description coverage, the description is incomplete. It lacks details on how novelty is assessed, parameter meanings, and expected return values, leaving the agent with insufficient context for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It doesn't mention the 'id' or 'type' parameters at all, nor does it explain their roles (e.g., 'id' as content identifier, 'type' as content category). With 2 parameters and no schema descriptions, the description adds no semantic value beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Return true if this content item has NOT been seen before.' This specifies the verb ('return true if...') and resource ('content item'), though it doesn't explicitly differentiate from sibling tools like 'markContentSeen' which might be related. The purpose is specific but lacks sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, context for checking content novelty, or how it relates to siblings like 'markContentSeen' (which might mark content as seen). Usage is implied but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
markContentSeenC
Mark a content item as seen AFTER posting.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states the action is to 'mark as seen' which implies a state change, but doesn't specify if this is idempotent, requires permissions, affects other operations, or what the expected outcome is. The timing hint ('AFTER posting') adds some context but leaves critical behavioral traits undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at just one sentence with zero wasted words. It's front-loaded with the core action and includes a useful timing constraint, making it efficient and easy to parse despite its brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and 2 undocumented parameters, the description is insufficient. It doesn't explain what 'marking as seen' means operationally, what the parameters represent, or what happens after invocation. The timing constraint helps but doesn't compensate for the broader contextual gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage for both parameters, the description provides no information about what 'id' and 'type' represent or how they should be used. While the enum values for 'type' are visible in the schema, the description doesn't explain their meaning or relationship to the marking operation, failing to compensate for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Mark as seen') and resource ('content item'), and specifies timing ('AFTER posting'), which provides useful context. However, it doesn't differentiate from sibling tools like 'isNewContent' that might check content status, leaving some ambiguity about when to use one versus the other.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal guidance with 'AFTER posting', but offers no explicit when-to-use rules, alternatives, or exclusions. It doesn't clarify if this should be used instead of or in conjunction with siblings like 'isNewContent', leaving the agent to guess about proper usage contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.0- Changed
fetchGithubReleases2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
fetchGooseBlog2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
fetchRss2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
fetchYoutube2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
isNewContent2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
markContentSeen2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
6 tool updates
- First observed
fetchGithubReleases - First observed
fetchGooseBlog - First observed
fetchRss - First observed
fetchYoutube - First observed
isNewContent - First observed
markContentSeen
TDQS
Scored across 6 tools
The tools are mostly distinct in purpose: four fetch specific content types (GitHub releases, blog posts, RSS feeds, YouTube videos), while isNewContent and markContentSeen handle content state management. There is minor potential confusion between fetchGooseBlog and fetchRss since both fetch blog posts, but their scopes (specific blog vs. any RSS feed) help differentiate them.
The naming is inconsistent: fetchGithubReleases, fetchGooseBlog, fetchRss, and fetchYoutube use camelCase with 'fetch' prefix, while isNewContent and markContentSeen use camelCase without a consistent verb pattern. This mix of styles (fetch vs. is/mark) and lack of a uniform naming convention reduces predictability.
With 6 tools, the count is well-scoped for a content fetching server. It covers multiple content sources and basic state management, providing a focused set without being overly sparse or bloated, which aligns well with the server's purpose.
The tool set is largely complete for content fetching and tracking: it includes fetching from various sources (GitHub, blogs, RSS, YouTube) and tools to check and mark content as seen. A minor gap is the lack of a tool to list or manage seen content, but agents can work around this by using isNewContent and markContentSeen in combination.
Maintenance
Related MCP Connectors
Track and browse RSS feeds with ease. Fetch the latest entries from any feed URL and extract full…
Give an AI agent eyes on the web: turn any feed, page, or stream into deduplicated change events.
Your curated sources (RSS, YouTube, podcasts, Google News) as context for any AI agent. 26 tools.
Track Bilibili creators and get the latest updates on videos, dynamics, and articles. Fetch user p…
Related MCP Servers
- AlicenseAqualityDmaintenanceSearch and discover YouTube channels via natural language, track them, and summarize videos without transcripts using Gemini API.13MIT
- AlicenseAqualityCmaintenanceSubscribe to RSS/Atom feeds and get a deduped daily brief, designed for daily Claude Desktop chats.513 npm1MIT
- AlicenseAqualityCmaintenanceEnables AI to manage RSS subscriptions, fetch and summarize news, and organize results into tools like Notion.910 npm3MIT
- FlicenseNot gradedqualityDmaintenanceAggregates news from multiple sources including Hacker News and RSS feeds, with caching, search, and easy configuration.16 npm-