Skip to main content
Glama
nubiia-dev

MCP NewsAPI.ai

by nubiia-dev

search_articles

Read-only

Search news articles (NewsAPI.ai / Event Registry). Cost: 1 token per call (measured live) when limited to the last 31 days (the default); querying the historical archive (allow_archive=true) costs extra tokens per year touched.

Instructions

Search news articles (NewsAPI.ai / Event Registry). Cost: 1 token per call (measured live) when limited to the last 31 days (the default); querying the historical archive (allow_archive=true) costs extra tokens per year touched. At least one of keyword / concept_uris / category_uris / source_uris / location_uris is required. Prefer concept_uris (from suggest_concepts, which is free) over free-text keyword for any company, person, place or organisation: keyword is for free terms/topics and is noisy with common words (e.g. "Telefónica" also matches the Spanish adjective "telefónica"), so resolve entities with suggest_concepts first and pass concept_uris. Results are compact: title, truncated body (body_len, default 300 chars), url, source, date, sentiment. Defaults to 10 results, newest first, duplicates skipped. Paginate with page; check total and pages in the response.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
langNo3-letter ISO 639-3 language codes, e.g. "spa" or ["eng", "spa"]. OR-ed. Accepts a single string or an array of strings.
pageNoResult page, starting at 1 (default 1).
countNoArticles per page, 1-100 (default 10). Keep small to save context.
keywordNoFree-text keyword or phrase, for topics and general terms (e.g. "inflation", "wildfire"). Do NOT use it for companies, people, places or organisations: common words double as names (e.g. "Telefónica" also matches the ordinary Spanish adjective "telefónica") and produce irrelevant results. For those entities call suggest_concepts first and pass the returned URI in concept_uris.
sort_byNoSort order (default date). "rel" ranks by relevance to the query.
body_lenNoMax body characters per article, 0-5000 (default 300; 0 = no body).
date_endNoLatest date, YYYY-MM-DD (inclusive); must be >= date_start. With allow_archive the date_start → date_end (default today) span may be at most 1 year.
sort_ascNoAscending order (default false).
data_typesNoContent types to include (default: all). Accepts a single string or an array of strings.
date_startNoEarliest date, YYYY-MM-DD (inclusive). Must be within the last 31 days unless allow_archive=true, which makes date_start mandatory.
keyword_locNoWhere to look for the keyword (default: the API default, body).
source_urisNoNews source URIs, e.g. "bbc.co.uk" (use suggest_sources). OR-ed. Accepts a single string or an array of strings.
concept_urisNoConcept URIs for entities: companies, people, places, organisations. PREFERRED over keyword for any named entity: first call suggest_concepts (free) to resolve the name, then pass the returned `uri` here. Multiple values are OR-ed and far more precise than keyword, which avoids homonym noise. Accepts a single string or an array of strings.
allow_archiveNoDefault false: search only the last 31 days (cheapest). Set true to reach the historical archive, which costs extra tokens per year queried; requires date_start and a range of at most 1 year.
category_urisNoCategory URIs, e.g. "news/Business" (use suggest_categories). OR-ed. Accepts a single string or an array of strings.
location_urisNoLocation URIs where the news happened (use suggest_locations). OR-ed. Accepts a single string or an array of strings.
max_sentimentNoMaximum sentiment, -1 to 1 (English articles only).
min_sentimentNoMinimum sentiment, -1 to 1 (English articles only).
ignore_keywordNoExclude articles mentioning this.
ignore_source_urisNoExclude these news sources. Accepts a single string or an array of strings.
include_duplicatesNoInclude duplicate/syndicated articles (default false).
keyword_search_modeNoHow to match the keyword: simple (any word), exact, or phrase.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed29 schema fields changedv1.0.2
    • addedInput schema / properties / category_uris / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / category_uris / description
      Previous value: -"Category URIs, e.g. \"news/Business\" (use suggest_categories). OR-ed."New value: +"Category URIs, e.g. \"news/Business\" (use suggest_categories). OR-ed. Accepts a single string or an array of strings."
    • removedInput schema / properties / category_uris / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / category_uris / type
      Removed value: -"array"
    • addedInput schema / properties / concept_uris / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / concept_uris / description
      Previous value: -"Concept URIs (entities such as people, companies, places) — obtain them with suggest_concepts. Multiple values are OR-ed. Far more precise than keyword."New value: +"Concept URIs for entities: companies, people, places, organisations. PREFERRED over keyword for any named entity: first call suggest_concepts (free) to resolve the name, then pass the returned `uri` here. Multiple values are OR-ed and far more precise than keyword, which avoids homonym noise. Accepts a single string or an array of strings."
    • removedInput schema / properties / concept_uris / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / concept_uris / type
      Removed value: -"array"
    • addedInput schema / properties / data_types / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "news",
      +      "pr",
      +      "blog"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "enum": [
      +        "news",
      +        "pr",
      +        "blog"
      +      ],
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / data_types / description
      Previous value: -"Content types to include (default: all)."New value: +"Content types to include (default: all). Accepts a single string or an array of strings."
    • removedInput schema / properties / data_types / items
      Removed value: -{
      -  "enum": [
      -    "news",
      -    "pr",
      -    "blog"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / data_types / type
      Removed value: -"array"
    • addedInput schema / properties / ignore_source_uris / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / ignore_source_uris / description
      Previous value: -"Exclude these news sources."New value: +"Exclude these news sources. Accepts a single string or an array of strings."
    • removedInput schema / properties / ignore_source_uris / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / ignore_source_uris / type
      Removed value: -"array"
    • changedInput schema / properties / keyword / description
      Previous value: -"Free-text keyword or phrase to search for."New value: +"Free-text keyword or phrase, for topics and general terms (e.g. \"inflation\", \"wildfire\"). Do NOT use it for companies, people, places or organisations: common words double as names (e.g. \"Telefónica\" also matches the ordinary Spanish adjective \"telefónica\") and produce irrelevant results. For those entities call suggest_concepts first and pass the returned URI in concept_uris."
    • addedInput schema / properties / lang / anyOf
      Added value: +[
      +  {
      +    "pattern": "^[a-z]{3}$",
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "pattern": "^[a-z]{3}$",
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / lang / description
      Previous value: -"3-letter ISO 639-3 language codes, e.g. [\"eng\", \"spa\"]. OR-ed."New value: +"3-letter ISO 639-3 language codes, e.g. \"spa\" or [\"eng\", \"spa\"]. OR-ed. Accepts a single string or an array of strings."
    • removedInput schema / properties / lang / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / lang / type
      Removed value: -"array"
    • addedInput schema / properties / location_uris / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / location_uris / description
      Previous value: -"Location URIs where the news happened (use suggest_locations). OR-ed."New value: +"Location URIs where the news happened (use suggest_locations). OR-ed. Accepts a single string or an array of strings."
    • removedInput schema / properties / location_uris / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / location_uris / type
      Removed value: -"array"
    • addedInput schema / properties / source_uris / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / source_uris / description
      Previous value: -"News source URIs, e.g. \"bbc.co.uk\" (use suggest_sources). OR-ed."New value: +"News source URIs, e.g. \"bbc.co.uk\" (use suggest_sources). OR-ed. Accepts a single string or an array of strings."
    • removedInput schema / properties / source_uris / items
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / source_uris / type
      Removed value: -"array"
  2. First observedv1.0.0

TDQS

A4.8/5.0
Behavior5/5

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

With readOnlyHint=true already covering safety, the description adds substantial behavioral context: token cost per call, extra archive cost per year touched, the 31-day default window, duplicate skipping, compact result shape, and pagination behavior. These are operational traits an agent needs before calling the tool.

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 appropriately sized for a 22-parameter search tool, and the core action plus cost model are front-loaded. There is some slight repetition around suggest_concepts/concept_uris, but it is not wasteful.

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 complex search tool with no output schema, the description covers query requirements, cost constraints, default time window, result fields, truncation behavior, deduplication, sorting defaults, and pagination. It gives the agent enough context to call the tool correctly without needing to inspect sibling tools first.

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 100%, so the baseline is 3. The description adds meaningful cross-parameter semantics beyond the schema, especially the any-of requirement across keyword/concept_uris/category_uris/source_uris/location_uris and practical guidance on concept-vs-keyword usage, archive cost, and pagination.

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 states a specific verb and resource: search news articles via NewsAPI.ai / Event Registry. It also makes the article-search scope clear against article-fetching and event-search siblings by focusing on article retrieval and naming the suggest_* tools used to resolve search filters.

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

Usage Guidelines5/5

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

It gives explicit invocation guidance: at least one of keyword, concept_uris, category_uris, source_uris, or location_uris is required. It also states when to prefer concept_uris over keyword and directs the agent to suggest_concepts for named entities, while explaining archive-cost tradeoffs and pagination.

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