Skip to main content
Glama

Query followed feeds: entries, source health, or aggregates

query_feeds
Read-only

Read followed feeds. "What's new?" is {"since":"1d"}: newest published first, one line per entry with format:"compact". Other arguments are optional; add where.collection, where.source.include/exclude, where.unread, or where.match when requested. per_source_limit produces a bounded fair sample across pages; omit it to retrieve every matching article. select:"sources" returns fetch_status and last_fetched_at separately from publisher activity (health, silent_days, entries_7d/28d). Quiet publishers can have working feeds. select:"aggregate" returns grouped counts with optional trends. Classification-filtered queries report classification_coverage: pending articles have not been assessed, not rejected. Times accept "7d"/"36h"/"now" or ISO dates. Example: {"since":"1d","per_source_limit":3,"limit":40,"format":"compact"} Example: {"select":"entries","where":{"unread":true,"collection":["Research"]},"limit":10} Example: {"select":"sources","having":{"silent_days":{"gte":30}},"limit":10} Example: {"select":"aggregate","group_by":"collection","where":{"discovered_after":"7d"}}

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 20, maximum 100; page further with next_cursor.
sinceNoThe "what's new" shorthand: entries published after this time (falling back to discovery time when the feed gives none), newest published first. {"since":"1d"} is the whole catch-up call. Entries only.
whereNoEntry selection predicate: fields AND together; omit a field to not filter on it. Source queries/mutations accept only collection and source; use query having for source-health filters.
cursorNoOnly a next_cursor from a previous response; omit on the first call.
fieldsNoProject only these entry fields. ["id"] is the cheap diff shape. Summary is opt-in.
formatNo"compact" returns token-lean text lines (#entry_id [source · s<source_id> · collection] date title / url) in `text`; entries is then an empty array and fields is ignored.
havingNoFilter groups/sources on derived values.
selectNo"entries" = rows · "sources" = per-source health (where.collection/source only; use having for health filters; stalled = nothing published in 14 days and nothing delivered in 7, quiet = nothing delivered in 7) · "aggregate" = counts. Default "entries".
compareNoTrend detection for aggregates: counts inside the window vs the prior baseline, e.g. {"window":"7d","baseline":"28d"}.
group_byNo
order_byNoDefault -discovered_at: newest arrivals first, so backfilled items never hide.
per_source_limitNoFair sample: at most this many entries per source across the result set, before pagination. Omit for an exhaustive stream. omitted.by_per_source_limit reports articles outside this sample.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
objectYes
selectYes
classification_coverageNoCoverage before the classification decision and pagination. Pending articles are not excluded; retry the query after classification catches up. Degraded assessments used the filter's uncertainty policy.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / per_source_limit / description
      Previous value: -"Fair allocation: at most this many entries per source, so one loud feed cannot fill the page."New value: +"Fair sample: at most this many entries per source across the result set, before pagination. Omit for an exhaustive stream. omitted.by_per_source_limit reports articles outside this sample."
    • changedOutput schema / description
      Previous value: -"entries: {total, returned, omitted:{by_limit}, next_cursor, entries[] | text} · sources: {total, returned, omitted:{by_having,by_limit}, next_cursor, sources[]} · aggregate: {group_by, total_entries, groups[]}."New value: +"entries: {total, returned, omitted:{by_limit}, next_cursor, entries[] | text} · sources: {total, returned, omitted:{by_having,by_limit}, next_cursor, sources[]} · aggregate: {group_by, total_entries, groups[]}. Filtered queries include classification_coverage. Source fetch_status and last_fetched_at describe fetching; legacy health describes publisher activity, so stalled does not mean fetching failed."
    • addedOutput schema / properties / classification_coverage
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Coverage before the classification decision and pagination. Pending articles are not excluded; retry the query after classification catches up. Degraded assessments used the filter's uncertainty policy.",
      +  "properties": {
      +    "classified": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "collection_id": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "degraded": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "filter_revision": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "pending": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "status": {
      +      "anyOf": [
      +        {
      +          "const": "pending",
      +          "type": "string"
      +        },
      +        {
      +          "const": "complete",
      +          "type": "string"
      +        },
      +        {
      +          "const": "degraded",
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "total": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "collection_id",
      +    "filter_revision",
      +    "status",
      +    "total",
      +    "classified",
      +    "pending",
      +    "degraded"
      +  ],
      +  "type": "object"
      +}
  2. Changed11 schema fields changed
    • addedInput schema / properties / cursor / description
      Added value: +"Only a next_cursor from a previous response; omit on the first call."
    • changedInput schema / properties / format / description
      Previous value: -"\"compact\" returns token-lean text lines instead of JSON entries."New value: +"\"compact\" returns token-lean text lines (#entry_id [source · s<source_id> · collection] date title / url) in `text`; entries is then an empty array and fields is ignored."
    • addedInput schema / properties / limit / description
      Added value: +"Default 20, maximum 100; page further with next_cursor."
    • changedInput schema / properties / select / description
      Previous value: -"\"entries\" = rows · \"sources\" = per-source health (where.collection/source only; use having for health filters) · \"aggregate\" = counts. Default \"entries\"."New value: +"\"entries\" = rows · \"sources\" = per-source health (where.collection/source only; use having for health filters; stalled = nothing published in 14 days and nothing delivered in 7, quiet = nothing delivered in 7) · \"aggregate\" = counts. Default \"entries\"."
    • addedInput schema / properties / since
      Added value: +{
      +  "description": "The \"what's new\" shorthand: entries published after this time (falling back to discovery time when the feed gives none), newest published first. {\"since\":\"1d\"} is the whole catch-up call. Entries only.",
      +  "maxLength": 64,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / where / properties / discovered_after / description
      Previous value: -"Relative window (\"7d\", \"36h\", \"45m\", \"2w\") or ISO date."New value: +"When smry first saw the entry. Backfill makes old posts look new here, so use it for diffs, not for \"what's new\". Relative window (\"7d\", \"36h\", \"45m\", \"2w\"), \"now\", or ISO date."
    • changedInput schema / properties / where / properties / discovered_before / description
      Previous value: -"Relative window (\"7d\", \"36h\", \"45m\", \"2w\") or ISO date."New value: +"Relative window (\"7d\", \"36h\", \"45m\", \"2w\"), \"now\", or ISO date."
    • changedInput schema / properties / where / properties / published_after / description
      Previous value: -"Relative window (\"7d\", \"36h\", \"45m\", \"2w\") or ISO date."New value: +"When the source published the entry (entries with no publish date are excluded; use top-level since to include them). Relative window (\"7d\", \"36h\", \"45m\", \"2w\"), \"now\", or ISO date."
    • changedInput schema / properties / where / properties / published_before / description
      Previous value: -"Relative window (\"7d\", \"36h\", \"45m\", \"2w\") or ISO date."New value: +"Relative window (\"7d\", \"36h\", \"45m\", \"2w\"), \"now\", or ISO date."
    • changedInput schema / properties / where / properties / source / properties / exclude / items / description
      Previous value: -"A source id (from any v2 response) or its exact title."New value: +"A source id (from any v2 response) or its title. Reads also accept a fragment that matches exactly one title."
    • changedInput schema / properties / where / properties / source / properties / include / items / description
      Previous value: -"A source id (from any v2 response) or its exact title."New value: +"A source id (from any v2 response) or its title. Reads also accept a fragment that matches exactly one title."
  3. Changed41 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • removedInput schema / properties / having / properties / count / properties / gte / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "maximum": 9007199254740991,
      -    "minimum": 0,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / having / properties / count / properties / gte / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / having / properties / count / properties / gte / minimum
      Added value: +0
    • addedInput schema / properties / having / properties / count / properties / gte / type
      Added value: +"integer"
    • removedInput schema / properties / having / properties / count / properties / lte / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "maximum": 9007199254740991,
      -    "minimum": 0,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / having / properties / count / properties / lte / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / having / properties / count / properties / lte / minimum
      Added value: +0
    • addedInput schema / properties / having / properties / count / properties / lte / type
      Added value: +"integer"
    • removedInput schema / properties / having / properties / silent_days / properties / gte / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "maximum": 9007199254740991,
      -    "minimum": 0,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / having / properties / silent_days / properties / gte / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / having / properties / silent_days / properties / gte / minimum
      Added value: +0
    • addedInput schema / properties / having / properties / silent_days / properties / gte / type
      Added value: +"integer"
    • removedInput schema / properties / having / properties / silent_days / properties / lte / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "maximum": 9007199254740991,
      -    "minimum": 0,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / having / properties / silent_days / properties / lte / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / having / properties / silent_days / properties / lte / minimum
      Added value: +0
    • addedInput schema / properties / having / properties / silent_days / properties / lte / type
      Added value: +"integer"
    • removedInput schema / properties / having / properties / unread / properties / gte / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "maximum": 9007199254740991,
      -    "minimum": 0,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / having / properties / unread / properties / gte / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / having / properties / unread / properties / gte / minimum
      Added value: +0
    • addedInput schema / properties / having / properties / unread / properties / gte / type
      Added value: +"integer"
    • removedInput schema / properties / having / properties / unread / properties / lte / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "maximum": 9007199254740991,
      -    "minimum": 0,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / having / properties / unread / properties / lte / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / having / properties / unread / properties / lte / minimum
      Added value: +0
    • addedInput schema / properties / having / properties / unread / properties / lte / type
      Added value: +"integer"
    • removedInput schema / properties / limit / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "maximum": 100,
      -    "minimum": 1,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / limit / maximum
      Added value: +100
    • addedInput schema / properties / limit / minimum
      Added value: +1
    • addedInput schema / properties / limit / type
      Added value: +"integer"
    • removedInput schema / properties / per_source_limit / anyOf
      Removed value: -[
      -  {
      -    "default": 0,
      -    "type": "string"
      -  },
      -  {
      -    "description": "Fair allocation: at most this many entries per source, so one loud feed cannot fill the page.",
      -    "maximum": 20,
      -    "minimum": 1,
      -    "type": "integer"
      -  }
      -]
    • addedInput schema / properties / per_source_limit / maximum
      Added value: +20
    • addedInput schema / properties / per_source_limit / minimum
      Added value: +1
    • addedInput schema / properties / per_source_limit / type
      Added value: +"integer"
    • changedInput schema / properties / select / description
      Previous value: -"\"entries\" = rows · \"sources\" = per-source health · \"aggregate\" = counts, never rows. Default \"entries\"."New value: +"\"entries\" = rows · \"sources\" = per-source health (where.collection/source only; use having for health filters) · \"aggregate\" = counts. Default \"entries\"."
    • changedInput schema / properties / where / description
      Previous value: -"Selection predicate shared by every feeds operation. All fields AND together; omit a field to not filter on it."New value: +"Entry selection predicate: fields AND together; omit a field to not filter on it. Source queries/mutations accept only collection and source; use query having for source-health filters."
    • changedInput schema / properties / where / properties / collection / items / anyOf
      Previous value: -[
      -  {
      -    "anyOf": [
      -      {
      -        "default": 0,
      -        "type": "string"
      -      },
      -      {
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    ]
      -  },
      -  {
      -    "maxLength": 100,
      -    "minLength": 1,
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "maxLength": 100,
      +    "minLength": 1,
      +    "type": "string"
      +  }
      +]
    • addedInput schema / properties / where / properties / collection / minItems
      Added value: +1
    • changedInput schema / properties / where / properties / source / properties / exclude / items / anyOf
      Previous value: -[
      -  {
      -    "anyOf": [
      -      {
      -        "default": 0,
      -        "type": "string"
      -      },
      -      {
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    ]
      -  },
      -  {
      -    "maxLength": 500,
      -    "minLength": 1,
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "maxLength": 500,
      +    "minLength": 1,
      +    "type": "string"
      +  }
      +]
    • addedInput schema / properties / where / properties / source / properties / exclude / minItems
      Added value: +1
    • changedInput schema / properties / where / properties / source / properties / include / items / anyOf
      Previous value: -[
      -  {
      -    "anyOf": [
      -      {
      -        "default": 0,
      -        "type": "string"
      -      },
      -      {
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    ]
      -  },
      -  {
      -    "maxLength": 500,
      -    "minLength": 1,
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  {
      +    "maxLength": 500,
      +    "minLength": 1,
      +    "type": "string"
      +  }
      +]
    • addedInput schema / properties / where / properties / source / properties / include / minItems
      Added value: +1
  4. Added

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses subtle behaviors: classification_coverage meaning, omitted.by_per_source_limit, quiet publishers with working feeds, and how select:'sources' separates health from activity. This is rich, non-obvious context that exceeds 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but each sentence conveys meaningful guidance, with examples at the end. It is front-loaded with the primary use case. Though long, it earns its length for a tool with three modes and many optional parameters; slightly better formatting would be a minor improvement.

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

Completeness5/5

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

For a tool with 12 parameters, nested objects, and three select modes, the description covers all major behaviors, provides four examples, and addresses edge cases (classification coverage, fair sampling, quiet publishers). With an output schema present, the description does not need to explain return types; it is complete for an agent to call correctly.

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?

Schema coverage is 92%, so the schema already explains most parameters. The description adds value through examples and clarifying combinations (e.g., 'add where.collection... when requested'), and explains the semantic intent of select modes and per_source_limit, supplementing the schema without redundant repetition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads followed feeds and explicitly distinguishes three select modes (entries, sources, aggregate) with concrete examples. It uses specific verbs and resources, making it unambiguous and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides extensive usage guidance for the tool's own options: 'What's new?' shorthand, when to add where clauses, per_source_limit behavior, and select-specific notes. It does not explicitly name alternatives or state when not to use this tool, but the context makes its primary role clear.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources