Skip to main content
Glama
nubiia-dev

MCP NewsAPI.ai

by nubiia-dev

MCP NewsAPI.ai

CI npm version License: MIT by Nubiia

A Model Context Protocol (MCP) server for NewsAPI.ai (the Event Registry news intelligence API). It lets AI assistants like Claude search news articles and events (clusters of articles about the same happening), resolve names to entity URIs, see what is trending, and keep an eye on the account's token budget.

Built and maintained by Nubiia — automatización e integraciones con IA para negocios (MCP, Holded, Pipedrive y más). ¿Quieres algo así para tu empresa? Escríbenos en nubiia.es.

⚠️ NewsAPI.ai is metered in tokens

Every search spends tokens from your plan, and a free plan has a small budget. This server is built to be frugal:

  • Result counts default to 10 (articles/events) and article bodies to 300 characters, so a call is cheap in tokens and in your assistant's context window.

  • Searches are limited to the last 31 days unless you pass allow_archive: true (historical data costs extra tokens per year touched). allow_archive requires date_start and the date_start → date_end (default: today) range may span at most 1 year. A date_start/date_end older than 31 days without allow_archive is rejected with an explanation instead of silently returning nothing.

  • A search with no filter at all is rejected locally, before it can spend anything.

  • A session token budget (default 200 tokens, see below) stops runaway loops before they reach the API.

  • The suggest_* tools and get_usage are free — use them to resolve entities to URIs before searching.

  • get_usage shows the remaining budget.

Costs measured against a live account (31-day window):

Tool

Tokens per call

search_articles, get_article

1

search_events, get_event (info)

5

get_event (include_articles)

1

get_trending_concepts

10

suggest_*, get_usage

0

Plans and pricing change — see newsapi.ai/pricing and docs/api-notes.md.

Related MCP server: News API MCP Server

Features

Ten read-only tools:

  • Articles (2): search_articles, get_article

  • Events (2): search_events, get_event

  • Autosuggest (4): suggest_concepts, suggest_categories, suggest_sources, suggest_locations

  • Trends (1): get_trending_concepts

  • Account (1): get_usage

Total: 10 tools, all marked readOnlyHint: true — nothing in this server writes to NewsAPI.ai or anywhere else.

What's deliberately out of scope for v1

Topic pages and saved searches, the analytics service (text categorization, sentiment of arbitrary text), story clustering, article mentions, aggregation result types (conceptAggr, timeAggr, …) and multi-tenant configuration.

Installation

Prerequisites

  • Node.js 22.14 or higher

  • A NewsAPI.ai account and API key, from newsapi.ai → Dashboard

Install from npm

npm install -g @nubiia/mcp-newsapi

Install from source

git clone https://github.com/nubiia-dev/mcp-newsapi.git
cd mcp-newsapi
npm install
npm run build

Configuration

Environment Variables

Variable

Required

Description

NEWSAPI_AI_API_KEY

Yes

Your NewsAPI.ai API key (Dashboard). Secret — never commit it.

NEWSAPI_AI_MAX_TOKENS_PER_SESSION

No

Max NewsAPI.ai tokens this server may spend per session (until the server process restarts). Default 200.

export NEWSAPI_AI_API_KEY=your_newsapi_ai_key
export NEWSAPI_AI_MAX_TOKENS_PER_SESSION=200   # optional

Session token budget

The budget is per server process: each MCP client/server instance you start has its own counter, so two clients configured with 200 can together spend 400. It resets on restart.

Every call is charged its measured token cost (see the table above) before it is sent. When a call would exceed the remaining budget, the tool returns an error stating the remaining and total budget and how to raise it — and no request is sent to NewsAPI.ai. Free tools (suggest_*, get_usage) are never blocked. get_usage also reports the session budget (maxTokens, spentTokens, remainingTokens) next to your account balance. Calls the API rejects outright (4xx) are refunded; calls that fail after being accepted (including HTTP 200 {"error"} bodies) stay charged, because the API bills them. An invalid value (e.g. abc, -5) falls back to 200 with a warning on stderr; 0 disables all paid calls.

Claude Desktop Configuration

Add to your Claude Desktop config file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "newsapi": {
      "command": "npx",
      "args": ["-y", "@nubiia/mcp-newsapi@latest"],
      "env": {
        "NEWSAPI_AI_API_KEY": "your_newsapi_ai_key",
        "NEWSAPI_AI_MAX_TOKENS_PER_SESSION": "200"
      }
    }
  }
}

Or if installed from source:

{
  "mcpServers": {
    "newsapi": {
      "command": "node",
      "args": ["/path/to/mcp-newsapi/dist/index.js"],
      "env": {
        "NEWSAPI_AI_API_KEY": "your_newsapi_ai_key"
      }
    }
  }
}

Claude Code Configuration

claude mcp add newsapi --env NEWSAPI_AI_API_KEY=your_newsapi_ai_key -- npx -y @nubiia/mcp-newsapi@latest

Troubleshooting

  • sh: mcp-newsapi: command not found when launching from inside this repo. If you start Claude Code (or another MCP client) from the cloned repository directory, npx @nubiia/mcp-newsapi resolves the local package.json instead of the published package, and the mcp-newsapi binary is not on the PATH. Pin the registry version with @latest (as in the examples above), or launch the client from another directory.

Tools

List parameters (lang, concept_uris, category_uris, source_uris, location_uris, ignore_source_uris, data_types, types, concept_types) accept either a single string or an array of strings: "lang": "spa" and "lang": ["spa"] are equivalent.

The recommended flow: suggest_* (free) → search_* → get_*.

suggest_concepts · read-only · free

Resolve a name ("Telefónica", "Pedro Sánchez") to a concept URI. Pass the uri as concept_uris to a search — far more precise than a keyword.

{ "prefix": "Telefónica", "types": ["org"], "count": 3 }

Searching for a company, person, place or organisation? Resolve it with suggest_concepts first and pass the returned uri as concept_uris. keyword is for free terms and topics and is noisy with common words: for example keyword: "Telefónica" in Spanish also matches the ordinary adjective "telefónica".

suggest_categories, suggest_sources, suggest_locations · read-only · free

Same idea for categories (news/Business), publications (bbc.co.uk) and places.

search_articles · read-only · 1 token

At least one of keyword, concept_uris, category_uris, source_uris, location_uris is required. Defaults: 10 results, newest first, duplicates skipped, last 31 days, 300-character bodies. Paginate with page; the response carries total and pages.

{
  "concept_uris": ["http://en.wikipedia.org/wiki/Telefónica"],
  "lang": ["spa"],
  "date_start": "2026-10-01",
  "count": 5
}

Dates must be real YYYY-MM-DD dates, date_end must not precede date_start, and the archive rules above apply (allow_archive needs date_start, max 1 year).

Other options: keyword_loc, keyword_search_mode, ignore_keyword, ignore_source_uris, data_types (news/pr/blog), sort_by (date/rel/sourceImportance/cosSim), min_sentiment/max_sentiment, body_len, include_duplicates, allow_archive.

get_article · read-only · 1 token

One article by article_uri, with a longer body (body_len, default 3000).

search_events · read-only · 5 tokens

Events: clusters of articles about the same happening, with title, short summary, date, location, key concepts and article count. The right granularity for "what is happening with X". sort_by: "size" surfaces the biggest stories; min_articles_in_event filters noise.

get_event · read-only · 5 tokens (1 with include_articles)

One event by event_uri, or — with include_articles: true — the articles covering it.

People, organisations and places trending right now (last 2 days vs last 2 weeks) in news, social, pr or blog (blog trends may be unavailable on some plans, and the failed call is still billed). The priciest tool: call it sparingly.

get_usage · read-only · free

availableTokens, usedTokens, remainingTokens. Check it before a batch of searches.

Rate limiting

A local guard stops runaway agent loops before they drain the token budget:

Tool(s)

Limit

search_articles, search_events, get_article, get_event

30 req/min

get_trending_concepts

20 req/min

suggest_*, get_usage

120 req/min

Everything else (default)

60 req/min

The API itself allows at most 5 simultaneous requests. 429/502/503/504 responses and connection-refused/DNS errors are retried with backoff; ambiguous failures (timeouts, connection resets) are not, because a metered request may already have been billed. Each attempt times out after 30 seconds.

Error messages

A 401/403 response includes an explanation, not just "Unauthorized": the key may be wrong/revoked, or the account may be out of tokens (get_usage tells you which). The API key is sent in the request body, never in a URL, and is redacted from every error message (HTTP, network and JSON-parse errors alike).

Development

npm install
npm run build
npm test              # runs entirely against mocks — no network, no API key
npm run test:coverage
npm run lint

See CONTRIBUTING.md for the full workflow and docs/api-notes.md for API behaviour verified against a live account.

License

MIT

Available Tools

10 tools
get_articleA
Read-only

Get one article by its URI (the uri returned by search_articles), with a longer body (body_len, default 3000 chars). Cost: 1 token per call. Use after search_articles when you need to read the article rather than just its headline.

ParametersJSON Schema
NameRequiredDescriptionDefault
body_lenNoMax body characters, 0-20000 (default 3000).
article_uriYesArticle URI as returned by search_articles (e.g. "8512345678").

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already establishes it is a safe read, so the description adds the cost model (1 token per call) and the fact that the body is length-bounded by default at 3000 chars. It does not describe truncation indicators, invalid-URI behavior, or what happens when body_len=0, so a small gap remains.

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?

Three tight sentences, front-loaded with what the tool returns and the identifier it needs, then the usage condition, then the cost. Every clause carries information an agent needs; no filler.

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?

For a two-parameter read tool with no output schema, the description covers the input source, the retrieval semantics, the default body length, and the cost. It leaves the response shape only implicitly described (article with body field), but an agent has enough to call it correctly.

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%: both article_uri and body_len (with its 0-20000 range and default) are already documented in the schema. The description restates the default 3000 and the URI provenance but adds no syntax, format, or edge-case detail beyond the structured fields, so the baseline 3 applies.

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?

States a specific verb (get) and resource (one article) and scopes it to the URI returned by search_articles, which is the exact identifier the sibling produces. An agent can immediately tell this apart from search_articles, which returns headlines rather than full body text.

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?

Gives an explicit sequencing rule: 'Use after search_articles when you need to read the article rather than just its headline.' It names the alternative and the condition that selects this tool, plus a cost signal (1 token per call) for budget-aware planning.

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

get_eventA
Read-only

Get one event by URI (the uri from search_events, e.g. "eng-1234567"). Returns its summary info by default; set include_articles=true to instead list the articles covering it (paginated, default 5 per page, body truncated to body_len). Cost: 5 tokens (info view) or 1 (articles view), measured live.

ParametersJSON Schema
NameRequiredDescriptionDefault
body_lenNoMax body characters per article, 0-5000 (default 300).
event_uriYesEvent URI, e.g. "eng-1234567".
articles_pageNoArticles page, from 1 (default 1).
articles_countNoArticles per page when include_articles=true, 1-50 (default 5).
include_articlesNoReturn the event’s articles instead of its info (default false).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, so the description carries real weight and delivers it: default view, mode switch, pagination default (5 per page), body truncation via body_len, and a concrete token cost per view that is "measured live." Cost and truncation behavior are not derivable from any structured field.

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?

Three tight sentences, front-loaded with the identifying URI pattern, then mode behavior, then cost. No sentence can be removed without losing an actionable fact.

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?

With no output schema, the description must characterize returns and does: summary info by default, a paginated article list otherwise, with truncation and cost specified. An agent has everything needed to call it correctly and predict the response shape.

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, but the description adds meaning beyond the schema by explaining that include_articles switches the entire response shape rather than merely adding a field, and by surfacing the pagination default and body_len truncation in prose. It stops short of explaining articles_page/articles_count interactions in depth.

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?

States a specific verb and resource ("Get one event by URI") and immediately distinguishes two operating modes: default summary info vs. an articles listing via include_articles=true. The reference to the `uri` from search_events makes it trivially separable from the sibling search_events and get_article 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?

Clearly routes the agent: obtain the URI from search_events, and choose include_articles when the goal is the covering articles rather than event info. It does not explicitly contrast itself with get_article for the articles view, so the alternative-selection guidance is slightly incomplete, but the context for use is unambiguous.

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

get_usageA
Read-only

Get the token budget of this NewsAPI.ai account: tokens available, used and remaining for the current period. Call it before a batch of searches (measured costs: search_articles and get_article 1 token, search_events and get_event info 5, get_trending_concepts 10). Free: does not consume tokens itself. Suggest tools are free too. Also reports this server’s session budget (NEWSAPI_AI_MAX_TOKENS_PER_SESSION, default 200): calls that would exceed it fail locally without reaching the API.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation it discloses that the call costs nothing, that it also reports the server session budget (NEWSAPI_AI_MAX_TOKENS_PER_SESSION, default 200), and — importantly — that calls exceeding that budget fail locally without reaching the API. That is exactly the kind of failure-mode context annotations do not carry.

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?

Front-loaded with purpose, then usage, then the cost table, then the session-budget caveat. Every sentence carries actionable content, though the parenthetical cost list and the session-budget note make it longer than a purely minimal definition.

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?

With no parameters, no output schema, and only a readOnlyHint annotation, the description still tells the agent everything needed: what it returns, when to call it, what it costs, and how the session budget can cause a local failure. Nothing material is missing.

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 tool takes zero parameters, so per the rubric the baseline is 4. There is nothing further the description could add about parameter meaning, and it appropriately spends its words on cost behavior instead.

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?

States a specific verb and resource — 'Get the token budget of this NewsAPI.ai account' — and immediately enumerates what is returned (available, used, remaining for the current period). It is clearly distinct from the search/get/suggest siblings in the sibling list.

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?

Explicitly prescribes when to call it ('before a batch of searches') and supplies a concrete cost table for the alternatives (search_articles/get_article 1, search_events/get_event 5, get_trending_concepts 10), plus the note that suggest tools are free. That is a direct decision aid for choosing among siblings.

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

search_articlesA
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. 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.

ParametersJSON 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.

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.

search_eventsA
Read-only

Search news EVENTS: clusters of articles about the same real-world happening, with a title, summary, date, location, key concepts and article count. Best for "what is happening with X" — one event replaces dozens of near-duplicate articles. Cost: 5 tokens (measured live) per call within the last 31 days (default); allow_archive=true costs extra per year touched. At least one of keyword / concept_uris / category_uris / source_uris / location_uris is required. Defaults to 10 events, newest first; use sort_by="size" for the biggest stories. Use get_event for details on one. For companies, people, places or organisations, resolve them with suggest_concepts first and pass concept_uris; keyword is for free terms/topics and is noisy with common words (e.g. "Telefónica" also matches the Spanish adjective "telefónica").

ParametersJSON 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).
countNoEvents per page, 1-50 (default 10).
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). "size" = most articles first.
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).
date_startNoEarliest date, YYYY-MM-DD (inclusive). Must be within the last 31 days unless allow_archive=true, which makes date_start mandatory.
source_urisNoNews source URIs, e.g. "bbc.co.uk" (use suggest_sources). OR-ed. Accepts a single string or an array of strings.
summary_lenNoMax summary characters per event, 0-2000 (default 300).
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.
min_articles_in_eventNoOnly events covered by at least this many articles (filters noise).

TDQS

A4.6/5.0
Behavior4/5

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

Beyond readOnlyHint, it discloses a concrete cost model (5 tokens per call in the 31-day window, extra per archive year), the at-least-one-filter requirement that the schema's empty `required` array does not convey, and the default ordering. It stops short of describing pagination limits or result-count behavior for the event list, but the operational constraints are unusually well surfaced.

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?

Front-loaded with the resource definition and the payoff ("one event replaces dozens of near-duplicate articles"), then cost, then the required-filter constraint, then routing guidance. Dense but nearly every sentence carries decision-relevant information; the token-cost phrase is slightly parenthetical but 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 15-parameter, no-output-schema search tool, the description covers the resource model, cost model, mandatory filter rule, defaults, sorting strategy, and per-filter routing to sibling suggest_* tools. An agent can construct a correct call without consulting anything else.

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 baseline is 3; the description still adds selection guidance the schema cannot, e.g. preferring concept_uris over keyword because of homonym noise and choosing sort_by="size" for biggest stories. The per-year archive cost implication of allow_archive also extends the schema's terse note.

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?

States a specific verb and resource ("Search news EVENTS") and immediately defines the resource as clusters of articles about one real-world happening, listing the fields returned. It explicitly separates itself from search_articles (event vs article granularity) and points to get_event for single-event detail.

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?

Gives an explicit use case ("what is happening with X"), an explicit exclusion (don't use keyword for named entities), and names the routing tools: suggest_concepts for entities, suggest_sources/suggest_categories/suggest_locations for other filters, get_event for details. It also explains the cost trade-off that governs when to use allow_archive.

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

suggest_categoriesA
Read-only

Resolve a topic name to category URIs (e.g. "news/Business", "dmoz/Sports/Soccer"). Pass the uri as category_uris to search_articles / search_events. Does not consume search tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoResult page, from 1 (default 1).
countNoMax suggestions, 1-50 (default 10).
prefixYesText typed so far (a name or the start of one), e.g. "Telef" or "bbc".

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true, so the safety profile is covered. The description adds a non-obvious operational trait — that this call does not consume search tokens — which is exactly the kind of cost/quota context annotations cannot express. It omits pagination/ordering behavior, but that is minor here.

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?

Three tight sentences, front-loaded with the core resolution behavior, followed by the integration instruction and the quota note. No filler or redundancy.

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?

With no output schema, the description usefully implies the return shape (items carrying a uri such as news/Business) and how to consume it downstream, which is the most important thing an agent needs. Minor gaps remain around ordering/pagination and the relationship to sibling suggest tools.

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% (page, count, and prefix all documented in-schema), so the baseline is 3. The description adds no format or constraint detail about prefix, page, or count beyond the schema, nor does it clarify the default paging semantics.

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?

States a specific verb and transformation: resolve a topic name into category URIs, with two concrete example outputs. It stops short of differentiating itself from the near-identical siblings suggest_concepts / suggest_sources / suggest_locations, so the agent must infer that this one is specifically for category URIs.

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

Usage Guidelines3/5

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

It gives a downstream workflow hint (pass the returned uri as category_uris to search_articles / search_events), which is genuinely useful. However it never says when to choose this tool over the sibling suggest_* tools or what input shape is expected beyond the schema's prefix description, so usage is implied rather than stated.

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

suggest_conceptsA
Read-only

Resolve a name to concept URIs (people, organisations, places, Wikipedia topics). Pass the returned uri as concept_uris to search_articles / search_events — much more precise than a keyword. Does not consume search tokens. Sorted by prominence in the news; check type and label to pick the right homonym.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the prefix, ISO 639-3 (default eng).
pageNoResult page, from 1 (default 1).
countNoMax suggestions, 1-50 (default 10).
typesNoRestrict to these concept kinds (default: all). Accepts a single string or an array of strings.
prefixYesText typed so far (a name or the start of one), e.g. "Telef" or "bbc".

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, but the description adds useful behavioral context: results are sorted by news prominence, and callers should inspect `type` and `label` to disambiguate homonyms. It does not mention pagination or result volume, but the core behavioral traits are well surfaced.

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 front-loaded with the core purpose, followed by precise downstream usage and a single disambiguation note. Every sentence adds signal, with no repetition or filler.

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 read-only suggestion tool with full parameter schema coverage, the description covers the essential gaps: what the output is, how to use it, token behavior, ordering, and homonym handling. No output schema exists, but the returned fields are adequately described.

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 five parameters are already well documented. The description adds only indirect guidance about the returned `uri`, `type`, and `label`, not the `prefix`, `lang`, `page`, `count`, or `types` inputs, so the baseline 3 is appropriate.

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?

States a specific verb-resource pair: resolve a name to concept URIs, with the resource kinds enumerated (people, organisations, places, Wikipedia topics). This clearly distinguishes it from sibling suggestion tools like suggest_sources or suggest_categories.

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?

Explicitly says to pass the returned `uri` as `concept_uris` to search_articles / search_events and contrasts this with keyword search. It also states that the tool does not consume search tokens, giving a clear operational reason to use it.

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

suggest_locationsA
Read-only

Resolve a city or country name to a location URI. Pass the uri as location_uris to search_articles / search_events to find news that happened there. Does not consume search tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage of the prefix, ISO 639-3 (default eng).
pageNoResult page, from 1 (default 1).
countNoMax suggestions, 1-50 (default 10).
prefixYesText typed so far (a name or the start of one), e.g. "Telef" or "bbc".

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover only readOnlyHint=true; the description adds genuinely useful behavioral context beyond that ('Does not consume search tokens') and clarifies the return type is a location URI, which matters for a resolver tool. It omits pagination/limit nuance, but the token-cost note is a meaningful addition.

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?

Three tight sentences, front-loaded with purpose, followed by the integration path and the token-cost caveat. No filler.

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?

With no output schema, the description correctly explains what is returned (a location URI) and how to use it, plus the token-cost trait. It is complete enough to invoke correctly, missing only edge-case behavior (empty results, pagination).

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 lang, page, count and prefix are already documented with defaults and ranges. The description only references the output `uri`, adding nothing about input parameter semantics; baseline 3 applies.

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 gives a precise verb+resource ('Resolve a city or country name to a location URI') and immediately names the siblings that consume the result. An agent can distinguish this from suggest_concepts/suggest_categories/suggest_sources without opening any schema.

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?

Explicitly states the usage path: pass the returned `uri` as `location_uris` to search_articles/search_events. It gives clear context for when to reach for this tool, though it does not state when NOT to use it or how it differs from the other suggest_* tools.

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

suggest_sourcesA
Read-only

Resolve a publication name or domain to news source URIs (e.g. "bbc.co.uk"). Pass the uri as source_uris to search_articles / search_events. Does not consume search tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoResult page, from 1 (default 1).
countNoMax suggestions, 1-50 (default 10).
prefixYesText typed so far (a name or the start of one), e.g. "Telef" or "bbc".
data_typesNoRestrict to sources of these content types (default: all). Accepts a single string or an array of strings.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful context that it 'does not consume search tokens,' but does not describe the return format or pagination, which are left implicit.

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?

Two sentences with zero waste, front-loaded with the purpose and followed by actionable integration guidance. Every sentence earns its place.

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?

For a read-only suggestion lookup with full schema coverage and no output schema, the description gives enough: what it returns (source URIs), how to use them downstream, and the token-cost note. A minor gap remains around result list structure and pagination, but that is largely inferable from the page/count parameters.

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 all four parameters (prefix, page, count, data_types) are already documented. The description adds no parameter-level detail beyond the example 'bbc.co.uk', so the baseline 3 applies.

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?

States a specific verb (Resolve) and resource (publication name or domain to news source URIs), with an example. It does not explicitly distinguish itself from sibling suggestion tools like suggest_concepts or suggest_categories, but the resource is clear enough for an agent to pick it correctly.

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?

Explains what to do with the result: 'Pass the `uri` as source_uris to search_articles / search_events.' This gives clear downstream context without naming when not to use it or alternatives among the suggest_* siblings.

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. 5 tool updatesv1.0.2
    • Changedget_trending_concepts4 fields changed
      • addedInput schema / properties / concept_types / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "person",
        +      "org",
        +      "loc",
        +      "wiki"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "enum": [
        +        "person",
        +        "org",
        +        "loc",
        +        "wiki"
        +      ],
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / concept_types / description
        Previous value: -"Concept kinds to include (default: person, org, loc)."New value: +"Concept kinds to include (default: person, org, loc). Accepts a single string or an array of strings."
      • removedInput schema / properties / concept_types / items
        Removed value: -{
        -  "enum": [
        -    "person",
        -    "org",
        -    "loc",
        -    "wiki"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / concept_types / type
        Removed value: -"array"
    • Changedsearch_articles29 fields changed
      • 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"
    • Changedsearch_events21 fields changed
      • 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"
      • 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"
    • Changedsuggest_concepts4 fields changed
      • addedInput schema / properties / types / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "person",
        +      "loc",
        +      "org",
        +      "wiki"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "enum": [
        +        "person",
        +        "loc",
        +        "org",
        +        "wiki"
        +      ],
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / types / description
        Previous value: -"Restrict to these concept kinds (default: all)."New value: +"Restrict to these concept kinds (default: all). Accepts a single string or an array of strings."
      • removedInput schema / properties / types / items
        Removed value: -{
        -  "enum": [
        -    "person",
        -    "loc",
        -    "org",
        -    "wiki"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / types / type
        Removed value: -"array"
    • Changedsuggest_sources4 fields changed
      • 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: -"Restrict to sources of these content types (default: all)."New value: +"Restrict to sources of these content types (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"
  2. 10 tool updatesv1.0.0
    • First observedget_article
    • First observedget_event
    • First observedget_trending_concepts
    • First observedget_usage
    • First observedsearch_articles
    • First observedsearch_events
    • First observedsuggest_categories
    • First observedsuggest_concepts
    • First observedsuggest_locations
    • First observedsuggest_sources

TDQS

A4.4/5.0

Scored across 10 tools

Disambiguation5/5

Each tool has a distinct role: search vs. get for articles/events, resolver tools for different filter types, usage, and trending. search_articles and search_events overlap conceptually but are clearly differentiated by article-level vs. event-cluster results. The descriptions make selection boundaries explicit.

Naming Consistency5/5

All names use snake_case and predictable verb_noun phrasing: get_*, search_*, suggest_*, and get_usage/get_trending_concepts. The resolver family is especially consistent. No mixed conventions or vague names.

Tool Count5/5

Ten tools is well-scoped for a news search API. The set covers article/event retrieval, entity/filter resolution, trending concepts, and account usage without obvious redundancy. Each tool earns its place.

Completeness4/5

The surface covers core news workflows: searching articles/events, retrieving full details, resolving all major query filters, checking trending concepts, and monitoring token usage. Minor gaps exist, such as no direct historical trend/timeline tool or source/category detail lookup beyond suggestions, but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides AI agents access to news aggregation from 80,000+ sources via the NewsAPI. Supports both authenticated access with API keys and pay-per-use via HTTP 402 protocol with blockchain payment verification.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to search news articles, get top headlines, and browse sources via the NewsAPI.org service.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables LLM agents to discover news sources, list articles, parse and extract article text, search news, and perform NLP analysis such as keyword extraction and summarization.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query news articles from TheNewsAPI.com through natural-language prompts, exposing search, top stories, headlines, similar articles, article lookup, and source listing as MCP tools.
    MIT