Skip to main content
Glama

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

  1. Ensure you have Node.js installed (version 14 or higher recommended).

  2. Install dependencies:

    npm install
  3. Build 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 start

For development with auto-reload:

npm run dev

Registering 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 content

  • type (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 content

  • type (enum): One of "youtube", "blog", or "release"

Returns: { "success": true }

How It Works

  1. Fetching: The fetch tools retrieve all available content from their respective sources

  2. Filtering: Use isNewContent to check if an item hasn't been seen before

  3. Tracking: After processing new content, use markContentSeen to mark it as seen

  4. Persistence: 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.xml

  • GitHub 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.json file

  • All fetch operations return the complete list of content; filtering for "new" items is done separately via isNewContent

Future Improvements

  1. Add configuration file support for customizing channels, feeds, and repositories

  2. Implement rate limiting and caching to optimize API usage

  3. Add more detailed logging and error handling

  4. Support for additional content sources

  5. Batch operations for checking multiple items at once

Available Tools

6 tools
fetchGithubReleasesB

Fetch ALL GitHub releases from the Goose repo.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesRSS feed URL

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 6 tool updatesv1.0.0
    • ChangedfetchGithubReleases2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • ChangedfetchGooseBlog2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • ChangedfetchRss2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • ChangedfetchYoutube2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • ChangedisNewContent2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • ChangedmarkContentSeen2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
  2. 6 tool updates
    • First observedfetchGithubReleases
    • First observedfetchGooseBlog
    • First observedfetchRss
    • First observedfetchYoutube
    • First observedisNewContent
    • First observedmarkContentSeen

TDQS

B3.2/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency2/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers