Skip to main content
Glama
olibuijr

Iceland News MCP Server

by olibuijr

list_feeds

Discover available Icelandic news feeds across multiple sources and languages. Returns structured metadata to help users access specific content streams.

Instructions

List all available news feeds from Icelandic news sources. Returns structured feed metadata.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sourceNoNews source to list feeds for: ruv, mbl, heimildin, mannlif, landsbankinn, hi, or allall

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
sourcesYes
totalFeedsYes

Implementation Reference

  • The handler function for list_feeds tool. It iterates over specified sources (or all), builds a structured list of feeds with metadata, generates a markdown table for display, and returns both text content and structured data.
      async ({ source }) => {
        const sourcesToList = source === "all" ? sourceNames : [source as SourceName];
    
        // Build structured response
        const feedList: Array<{
          source: string;
          sourceName: string;
          baseUrl: string;
          feeds: Array<{
            id: string;
            description: string;
            resourceUri: string;
          }>;
        }> = [];
    
        let markdownOutput = "";
    
        for (const src of sourcesToList) {
          const sourceInfo = SOURCES[src];
    
          const feeds = Object.entries(sourceInfo.feeds).map(([feedKey, feedInfo]) => ({
            id: feedKey,
            description: feedInfo.description,
            resourceUri: `news://${src}/${feedKey}`,
          }));
    
          feedList.push({
            source: src,
            sourceName: sourceInfo.name,
            baseUrl: sourceInfo.baseUrl,
            feeds,
          });
    
          // Markdown format
          markdownOutput += `# ${sourceInfo.name}\n\n`;
          markdownOutput += `| Feed | Description | Resource URI |\n|------|-------------|---------------|\n`;
    
          for (const feed of feeds) {
            markdownOutput += `| \`${feed.id}\` | ${feed.description} | \`${feed.resourceUri}\` |\n`;
          }
    
          markdownOutput += "\n";
        }
    
        const structuredResponse = {
          sources: feedList,
          totalFeeds: feedList.reduce((sum, s) => sum + s.feeds.length, 0),
        };
    
        return {
          content: [
            {
              type: "text" as const,
              text: markdownOutput,
            },
          ],
          structuredContent: structuredResponse,
        };
      }
    );
  • Output schema for list_feeds tool defining the structure of the response with sources and their feeds.
    const FeedListResponseSchema = z.object({
      sources: z.array(z.object({
        source: z.string(),
        sourceName: z.string(),
        baseUrl: z.string(),
        feeds: z.array(z.object({
          id: z.string(),
          description: z.string(),
          resourceUri: z.string(),
        })),
      })),
      totalFeeds: z.number(),
    });
  • src/index.ts:680-751 (registration)
    Registration of the list_feeds tool using server.registerTool, including description, input/output schemas, and handler reference.
    server.registerTool(
      "list_feeds",
      {
        description: "List all available news feeds from Icelandic news sources. Returns structured feed metadata.",
        inputSchema: {
          source: z
            .enum([...sourceNames, "all"] as [string, ...string[]])
            .default("all")
            .describe("News source to list feeds for: ruv, mbl, heimildin, mannlif, landsbankinn, hi, or all"),
        },
        outputSchema: FeedListResponseSchema,
      },
      async ({ source }) => {
        const sourcesToList = source === "all" ? sourceNames : [source as SourceName];
    
        // Build structured response
        const feedList: Array<{
          source: string;
          sourceName: string;
          baseUrl: string;
          feeds: Array<{
            id: string;
            description: string;
            resourceUri: string;
          }>;
        }> = [];
    
        let markdownOutput = "";
    
        for (const src of sourcesToList) {
          const sourceInfo = SOURCES[src];
    
          const feeds = Object.entries(sourceInfo.feeds).map(([feedKey, feedInfo]) => ({
            id: feedKey,
            description: feedInfo.description,
            resourceUri: `news://${src}/${feedKey}`,
          }));
    
          feedList.push({
            source: src,
            sourceName: sourceInfo.name,
            baseUrl: sourceInfo.baseUrl,
            feeds,
          });
    
          // Markdown format
          markdownOutput += `# ${sourceInfo.name}\n\n`;
          markdownOutput += `| Feed | Description | Resource URI |\n|------|-------------|---------------|\n`;
    
          for (const feed of feeds) {
            markdownOutput += `| \`${feed.id}\` | ${feed.description} | \`${feed.resourceUri}\` |\n`;
          }
    
          markdownOutput += "\n";
        }
    
        const structuredResponse = {
          sources: feedList,
          totalFeeds: feedList.reduce((sum, s) => sum + s.feeds.length, 0),
        };
    
        return {
          content: [
            {
              type: "text" as const,
              text: markdownOutput,
            },
          ],
          structuredContent: structuredResponse,
        };
      }
    );
  • Input schema for list_feeds tool, defining the optional 'source' parameter.
    inputSchema: {
      source: z
        .enum([...sourceNames, "all"] as [string, ...string[]])
        .default("all")
        .describe("News source to list feeds for: ruv, mbl, heimildin, mannlif, landsbankinn, hi, or all"),
    },
  • The SOURCES configuration object used by list_feeds to enumerate all available feeds across Icelandic news providers.
    const SOURCES: Record<string, SourceInfo> = {
      ruv: {
        name: "RÚV (Ríkisútvarpið)",
        baseUrl: "https://www.ruv.is",
        feeds: {
          frettir: { url: "https://www.ruv.is/rss/frettir", description: "All news" },
          innlent: { url: "https://www.ruv.is/rss/innlent", description: "Domestic news" },
          erlent: { url: "https://www.ruv.is/rss/erlent", description: "International news" },
          ithrottir: { url: "https://www.ruv.is/rss/ithrottir", description: "Sports" },
          "menning-og-daegurmal": { url: "https://www.ruv.is/rss/menning-og-daegurmal", description: "Culture & current affairs" },
          audskilid: { url: "https://www.ruv.is/rss/audskilid", description: "Plain language Icelandic" },
          english: { url: "https://www.ruv.is/rss/english", description: "English news" },
          polski: { url: "https://www.ruv.is/rss/polski", description: "Polish news" },
        },
      },
      mbl: {
        name: "Morgunblaðið",
        baseUrl: "https://www.mbl.is",
        feeds: {
          // Main news
          fp: { url: "https://www.mbl.is/feeds/fp/", description: "Front page news" },
          innlent: { url: "https://www.mbl.is/feeds/innlent/", description: "Domestic news" },
          erlent: { url: "https://www.mbl.is/feeds/erlent/", description: "International news" },
          togt: { url: "https://www.mbl.is/feeds/togt/", description: "Tech & science" },
          english: { url: "https://www.mbl.is/feeds/english/", description: "English news" },
          helst: { url: "https://www.mbl.is/feeds/helst/", description: "Top stories" },
          nyjast: { url: "https://www.mbl.is/feeds/nyjast/", description: "Latest news" },
          sjonvarp: { url: "https://www.mbl.is/feeds/sjonvarp/", description: "TV news" },
          // Culture
          menning: { url: "https://www.mbl.is/feeds/menning/", description: "Culture" },
          // Business
          vidskipti: { url: "https://www.mbl.is/feeds/vidskipti/", description: "Business" },
          // Marine/Fishing
          "200milur": { url: "https://www.mbl.is/feeds/200milur/", description: "Marine & fishing" },
          // Sports
          sport: { url: "https://www.mbl.is/feeds/sport/", description: "Sports" },
          fotbolti: { url: "https://www.mbl.is/feeds/fotbolti/", description: "Football" },
          enski: { url: "https://www.mbl.is/feeds/enski/", description: "English Premier League" },
          golf: { url: "https://www.mbl.is/feeds/golf/", description: "Golf" },
          handbolti: { url: "https://www.mbl.is/feeds/handbolti/", description: "Handball" },
          korfubolti: { url: "https://www.mbl.is/feeds/korfubolti/", description: "Basketball" },
          pepsideild: { url: "https://www.mbl.is/feeds/pepsideild/", description: "Pepsi league (Icelandic football)" },
          formula: { url: "https://www.mbl.is/feeds/formula/", description: "Formula 1" },
          hestar: { url: "https://www.mbl.is/feeds/hestar/", description: "Horses" },
          rafithrottir: { url: "https://www.mbl.is/feeds/rafithrottir/", description: "Esports" },
          // People & lifestyle
          folk: { url: "https://www.mbl.is/feeds/folk/", description: "People" },
          verold: { url: "https://www.mbl.is/feeds/verold/", description: "World/Celebrities" },
          // Food & Travel
          matur: { url: "https://www.mbl.is/feeds/matur/", description: "Food" },
          ferdalog: { url: "https://www.mbl.is/feeds/ferdalog/", description: "Travel" },
          // Smartland (lifestyle)
          smartland: { url: "https://www.mbl.is/feeds/smartland/", description: "Smartland" },
          stars: { url: "https://www.mbl.is/feeds/stars/", description: "Celebrities" },
          tiska: { url: "https://www.mbl.is/feeds/tiska/", description: "Fashion" },
          heimili: { url: "https://www.mbl.is/feeds/heimili/", description: "Home & design" },
          utlit: { url: "https://www.mbl.is/feeds/utlit/", description: "Beauty" },
          heilsa: { url: "https://www.mbl.is/feeds/heilsa/", description: "Health & nutrition" },
          frami: { url: "https://www.mbl.is/feeds/frami/", description: "Success stories" },
          samkvaemislifid: { url: "https://www.mbl.is/feeds/samkvaemislifid/", description: "Social life" },
          fjolskyldan: { url: "https://www.mbl.is/feeds/fjolskyldan/", description: "Family" },
          // Cars
          bill: { url: "https://www.mbl.is/feeds/bill/", description: "Cars" },
          // K100
          k100: { url: "https://www.mbl.is/feeds/k100/", description: "K100 radio" },
          // Morgunblaðið newspaper
          "mogginn-idag": { url: "https://www.mbl.is/feeds/mogginn/idag/", description: "Today's paper" },
          "mogginn-featured": { url: "https://www.mbl.is/feeds/mogginn/featured/", description: "Featured articles" },
          "mogginn-leidarar": { url: "https://www.mbl.is/feeds/mogginn/leidarar/", description: "Editorials" },
          "mogginn-sunnudagur": { url: "https://www.mbl.is/feeds/mogginn/sunnudagur/", description: "Sunday edition" },
          "mogginn-netgreinar": { url: "https://www.mbl.is/feeds/mogginn/netgreinar/", description: "Selected articles" },
          // Other
          fasteignir: { url: "https://www.mbl.is/feeds/fasteignir/", description: "Real estate" },
          smaaugl: { url: "https://www.mbl.is/feeds/smaaugl/", description: "Classifieds" },
          blog: { url: "https://www.mbl.is/feeds/blog/", description: "Blog discussions" },
        },
      },
      heimildin: {
        name: "Heimildin",
        baseUrl: "https://heimildin.is",
        feeds: {
          frettir: { url: "https://heimildin.is/rss/", description: "All news" },
        },
      },
      mannlif: {
        name: "Mannlíf",
        baseUrl: "https://mannlif.is",
        feeds: {
          frettir: { url: "https://mannlif.is/rss/", description: "All news" },
        },
      },
      landsbankinn: {
        name: "Landsbankinn",
        baseUrl: "https://www.landsbankinn.is",
        feeds: {
          frettir: { url: "https://www.landsbankinn.is/api/rss", description: "News & announcements" },
        },
      },
      hi: {
        name: "Háskóli Íslands (University of Iceland)",
        baseUrl: "https://hi.is",
        feeds: {
          // University-wide
          frettir: { url: "https://hi.is/frettir/18556/feed", description: "University news" },
          vidburdir: { url: "https://hi.is/vidburdir/18556/feed", description: "University events" },
          // School of Social Sciences
          "felagsvisindasvid-frettir": { url: "https://hi.is/frettir/18551/feed", description: "Social Sciences news" },
          "felagsvisindasvid-vidburdir": { url: "https://hi.is/vidburdir/18551/feed", description: "Social Sciences events" },
          // School of Health Sciences
          "heilbrigdisvisindasvid-frettir": { url: "https://hi.is/frettir/18552/feed", description: "Health Sciences news" },
          "heilbrigdisvisindasvid-vidburdir": { url: "https://hi.is/vidburdir/18552/feed", description: "Health Sciences events" },
          // School of Humanities
          "hugvisindasvid-frettir": { url: "https://hi.is/frettir/18553/feed", description: "Humanities news" },
          "hugvisindasvid-vidburdir": { url: "https://hi.is/vidburdir/18553/feed", description: "Humanities events" },
          // School of Education
          "menntavisindasvid-frettir": { url: "https://hi.is/frettir/18554/feed", description: "Education news" },
          "menntavisindasvid-vidburdir": { url: "https://hi.is/vidburdir/18554/feed", description: "Education events" },
          // School of Engineering and Natural Sciences
          "verkfraedi-natturuvisindasvid-frettir": { url: "https://hi.is/frettir/18555/feed", description: "Engineering & Natural Sciences news" },
          "verkfraedi-natturuvisindasvid-vidburdir": { url: "https://hi.is/vidburdir/18555/feed", description: "Engineering & Natural Sciences events" },
        },
      },
      // Additional Icelandic news sources
      visir: {
        name: "Vísir",
        baseUrl: "https://www.visir.is",
        feeds: {
          frettir: { url: "https://www.visir.is/rss/allt", description: "All news" },
          innlent: { url: "https://www.visir.is/rss/innlent", description: "Domestic news" },
          erlent: { url: "https://www.visir.is/rss/erlent", description: "International news" },
          ithrottir: { url: "https://www.visir.is/rss/ithrottir", description: "Sports" },
          lifid: { url: "https://www.visir.is/rss/lifid", description: "Lifestyle" },
          spilavinir: { url: "https://www.visir.is/rss/spilavinir", description: "Gaming" },
        },
      },
      dv: {
        name: "DV (Dagblaðið Vísir)",
        baseUrl: "https://www.dv.is",
        feeds: {
          frettir: { url: "https://www.dv.is/feed/", description: "All news" },
        },
      },
      stundin: {
        name: "Stundin",
        baseUrl: "https://stundin.is",
        feeds: {
          frettir: { url: "https://stundin.is/rss/", description: "All news" },
        },
      },
      frettabladid: {
        name: "Fréttablaðið",
        baseUrl: "https://www.frettabladid.is",
        feeds: {
          frettir: { url: "https://www.frettabladid.is/rss/", description: "All news" },
        },
      },
      kjarninn: {
        name: "Kjarninn",
        baseUrl: "https://kjarninn.is",
        feeds: {
          frettir: { url: "https://kjarninn.is/rss/", description: "All news" },
        },
      },
      icelandreview: {
        name: "Iceland Review",
        baseUrl: "https://www.icelandreview.com",
        feeds: {
          frettir: { url: "https://www.icelandreview.com/feed/", description: "English news about Iceland" },
        },
      },
      grapevine: {
        name: "Reykjavík Grapevine",
        baseUrl: "https://grapevine.is",
        feeds: {
          frettir: { url: "https://grapevine.is/feed/", description: "English news and culture" },
        },
      },
      vedur: {
        name: "Veðurstofa Íslands (Icelandic Met Office)",
        baseUrl: "https://www.vedur.is",
        feeds: {
          frettir: { url: "https://www.vedur.is/rss/frettir", description: "Weather news and alerts" },
        },
      },
    };
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool lists feeds and returns structured metadata, which implies a read-only operation, but doesn't cover aspects like rate limits, authentication needs, error handling, or pagination. This is adequate for a simple list tool but lacks depth.

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 two concise sentences with zero waste: the first states the purpose and scope, and the second specifies the return type. It's front-loaded and appropriately sized for a simple tool, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (1 optional parameter) and the presence of an output schema (which handles return values), the description is reasonably complete. It covers the core functionality and return type, though it could benefit from more behavioral context or usage guidance to reach a perfect score.

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?

The input schema has 100% description coverage, detailing the 'source' parameter with enum values and a default. The description adds no parameter-specific information beyond what the schema provides, so it meets the baseline of 3 for high schema coverage without compensating value.

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 ('List all available news feeds') and resource ('from Icelandic news sources'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'get_news' or 'search_news' which might have overlapping functionality, keeping it from a perfect 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 'get_news' or 'search_news'. It mentions the return type ('structured feed metadata') but offers no context about use cases, prerequisites, or exclusions, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/olibuijr/iceland-news-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server