MCP NewsAPI.ai
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP NewsAPI.aisearch recent news about Tesla earnings"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP NewsAPI.ai
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_archiverequiresdate_startand thedate_start→date_end(default: today) range may span at most 1 year. Adate_start/date_endolder than 31 days withoutallow_archiveis 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 andget_usageare free — use them to resolve entities to URIs before searching.get_usageshows the remaining budget.
Costs measured against a live account (31-day window):
Tool | Tokens per call |
| 1 |
| 5 |
| 1 |
| 10 |
| 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_articleEvents (2):
search_events,get_eventAutosuggest (4):
suggest_concepts,suggest_categories,suggest_sources,suggest_locationsTrends (1):
get_trending_conceptsAccount (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-newsapiInstall from source
git clone https://github.com/nubiia-dev/mcp-newsapi.git
cd mcp-newsapi
npm install
npm run buildConfiguration
Environment Variables
Variable | Required | Description |
| Yes | Your NewsAPI.ai API key (Dashboard). Secret — never commit it. |
| 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 # optionalSession 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@latestTroubleshooting
sh: mcp-newsapi: command not foundwhen launching from inside this repo. If you start Claude Code (or another MCP client) from the cloned repository directory,npx @nubiia/mcp-newsapiresolves the localpackage.jsoninstead of the published package, and themcp-newsapibinary is not on thePATH. 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_conceptsfirst and pass the returneduriasconcept_uris.keywordis for free terms and topics and is noisy with common words: for examplekeyword: "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.
get_trending_concepts · read-only · 10 tokens
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 |
| 30 req/min |
| 20 req/min |
| 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 lintSee CONTRIBUTING.md for the full workflow and
docs/api-notes.md for API behaviour verified against a live account.
License
Related
@nubiia/mcp-holded— MCP server for the Holded invoicing/accounting API.@nubiia/mcp-signaturit— MCP server for the Signaturit e-signature API.
Available Tools
10 toolsget_articleARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| body_len | No | Max body characters, 0-20000 (default 3000). | |
| article_uri | Yes | Article URI as returned by search_articles (e.g. "8512345678"). |
TDQS
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.
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.
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.
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.
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.
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_eventARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| body_len | No | Max body characters per article, 0-5000 (default 300). | |
| event_uri | Yes | Event URI, e.g. "eng-1234567". | |
| articles_page | No | Articles page, from 1 (default 1). | |
| articles_count | No | Articles per page when include_articles=true, 1-50 (default 5). | |
| include_articles | No | Return the event’s articles instead of its info (default false). |
TDQS
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.
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.
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.
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.
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.
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_trending_conceptsARead-only
Get the concepts (people, organisations, places) that are trending right now in the news — computed by comparing mentions in the last 2 days against the last 2 weeks. Use source to switch between news, social, pr and blog (blog trends are not computed on every plan: the API then answers "not computed" and the call is still billed). Defaults to the top 10 people/organisations/places in news. Cost: 10 tokens per call regardless of count (measured live) - the priciest tool, use sparingly.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many trends, 1-50 (default 10). | |
| source | No | Data source to compute trends from (default news). | |
| concept_types | No | Concept kinds to include (default: person, org, loc). Accepts a single string or an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation: it discloses the exact cost (10 tokens per call, regardless of count), warns that blog trends may be 'not computed' yet still billed, and explains the comparison window used to compute trends. This is precisely the kind of billing and failure-mode context an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and computation, then layers source and cost caveats. It is dense with parentheticals and could be split for readability, but every sentence carries non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essentials for a 3-parameter read tool with no output schema: what is returned, how it is computed, source behavior, defaults, and cost. The only gap is that it doesn't describe the shape of a returned trend entry, which is minor given there is no output schema to lean on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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: it explains that `source` switches the underlying data pipeline, calls out the blog-plan caveat not visible in the enum, and restates the default result shape (top 10 people/organisations/places in news). `count` and `concept_types` are left to the schema, keeping it at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get the concepts... trending right now in the news') and even explains the computation (last 2 days vs last 2 weeks). It does not explicitly distinguish itself from the sibling `suggest_concepts`, which is the one tool an agent might confuse it with, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use signal ('trending right now'), a source-selection rule, and an explicit when-not-to-overuse instruction ('the priciest tool, use sparingly'). It does not name an alternative tool for non-trending concept lookups, so it lacks the explicit alternative routing that would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_articlesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | 3-letter ISO 639-3 language codes, e.g. "spa" or ["eng", "spa"]. OR-ed. Accepts a single string or an array of strings. | |
| page | No | Result page, starting at 1 (default 1). | |
| count | No | Articles per page, 1-100 (default 10). Keep small to save context. | |
| keyword | No | 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. | |
| sort_by | No | Sort order (default date). "rel" ranks by relevance to the query. | |
| body_len | No | Max body characters per article, 0-5000 (default 300; 0 = no body). | |
| date_end | No | Latest 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_asc | No | Ascending order (default false). | |
| data_types | No | Content types to include (default: all). Accepts a single string or an array of strings. | |
| date_start | No | Earliest date, YYYY-MM-DD (inclusive). Must be within the last 31 days unless allow_archive=true, which makes date_start mandatory. | |
| keyword_loc | No | Where to look for the keyword (default: the API default, body). | |
| source_uris | No | News source URIs, e.g. "bbc.co.uk" (use suggest_sources). OR-ed. Accepts a single string or an array of strings. | |
| concept_uris | No | 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. | |
| allow_archive | No | Default 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_uris | No | Category URIs, e.g. "news/Business" (use suggest_categories). OR-ed. Accepts a single string or an array of strings. | |
| location_uris | No | Location URIs where the news happened (use suggest_locations). OR-ed. Accepts a single string or an array of strings. | |
| max_sentiment | No | Maximum sentiment, -1 to 1 (English articles only). | |
| min_sentiment | No | Minimum sentiment, -1 to 1 (English articles only). | |
| ignore_keyword | No | Exclude articles mentioning this. | |
| ignore_source_uris | No | Exclude these news sources. Accepts a single string or an array of strings. | |
| include_duplicates | No | Include duplicate/syndicated articles (default false). | |
| keyword_search_mode | No | How to match the keyword: simple (any word), exact, or phrase. |
TDQS
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.
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.
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.
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.
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.
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_eventsARead-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").
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | 3-letter ISO 639-3 language codes, e.g. "spa" or ["eng", "spa"]. OR-ed. Accepts a single string or an array of strings. | |
| page | No | Result page, starting at 1 (default 1). | |
| count | No | Events per page, 1-50 (default 10). | |
| keyword | No | 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. | |
| sort_by | No | Sort order (default date). "size" = most articles first. | |
| date_end | No | Latest 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_asc | No | Ascending order (default false). | |
| date_start | No | Earliest date, YYYY-MM-DD (inclusive). Must be within the last 31 days unless allow_archive=true, which makes date_start mandatory. | |
| source_uris | No | News source URIs, e.g. "bbc.co.uk" (use suggest_sources). OR-ed. Accepts a single string or an array of strings. | |
| summary_len | No | Max summary characters per event, 0-2000 (default 300). | |
| concept_uris | No | 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. | |
| allow_archive | No | Default 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_uris | No | Category URIs, e.g. "news/Business" (use suggest_categories). OR-ed. Accepts a single string or an array of strings. | |
| location_uris | No | Location URIs where the news happened (use suggest_locations). OR-ed. Accepts a single string or an array of strings. | |
| min_articles_in_event | No | Only events covered by at least this many articles (filters noise). |
TDQS
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.
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.
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.
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.
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.
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_categoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page, from 1 (default 1). | |
| count | No | Max suggestions, 1-50 (default 10). | |
| prefix | Yes | Text typed so far (a name or the start of one), e.g. "Telef" or "bbc". |
TDQS
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.
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.
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.
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.
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.
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_conceptsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the prefix, ISO 639-3 (default eng). | |
| page | No | Result page, from 1 (default 1). | |
| count | No | Max suggestions, 1-50 (default 10). | |
| types | No | Restrict to these concept kinds (default: all). Accepts a single string or an array of strings. | |
| prefix | Yes | Text typed so far (a name or the start of one), e.g. "Telef" or "bbc". |
TDQS
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.
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.
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.
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.
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.
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_locationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the prefix, ISO 639-3 (default eng). | |
| page | No | Result page, from 1 (default 1). | |
| count | No | Max suggestions, 1-50 (default 10). | |
| prefix | Yes | Text typed so far (a name or the start of one), e.g. "Telef" or "bbc". |
TDQS
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.
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.
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.
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.
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.
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_sourcesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page, from 1 (default 1). | |
| count | No | Max suggestions, 1-50 (default 10). | |
| prefix | Yes | Text typed so far (a name or the start of one), e.g. "Telef" or "bbc". | |
| data_types | No | Restrict to sources of these content types (default: all). Accepts a single string or an array of strings. |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v1.0.2- Changed
get_trending_concepts4 fields changed- added
Input schema / properties / concept_types / anyOfAdded value: +[ + { + "enum": [ + "person", + "org", + "loc", + "wiki" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "person", + "org", + "loc", + "wiki" + ], + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / concept_types / descriptionPrevious 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." - removed
Input schema / properties / concept_types / itemsRemoved value: -{ - "enum": [ - "person", - "org", - "loc", - "wiki" - ], - "type": "string" -} - removed
Input schema / properties / concept_types / typeRemoved value: -"array"
- Changed
search_articles29 fields changed- added
Input schema / properties / category_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / category_uris / descriptionPrevious 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." - removed
Input schema / properties / category_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / category_uris / typeRemoved value: -"array" - added
Input schema / properties / concept_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / concept_uris / descriptionPrevious 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." - removed
Input schema / properties / concept_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / concept_uris / typeRemoved value: -"array" - added
Input schema / properties / data_types / anyOfAdded value: +[ + { + "enum": [ + "news", + "pr", + "blog" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "news", + "pr", + "blog" + ], + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / data_types / descriptionPrevious value: -"Content types to include (default: all)."New value: +"Content types to include (default: all). Accepts a single string or an array of strings." - removed
Input schema / properties / data_types / itemsRemoved value: -{ - "enum": [ - "news", - "pr", - "blog" - ], - "type": "string" -} - removed
Input schema / properties / data_types / typeRemoved value: -"array" - added
Input schema / properties / ignore_source_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / ignore_source_uris / descriptionPrevious value: -"Exclude these news sources."New value: +"Exclude these news sources. Accepts a single string or an array of strings." - removed
Input schema / properties / ignore_source_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / ignore_source_uris / typeRemoved value: -"array" - changed
Input schema / properties / keyword / descriptionPrevious 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." - added
Input schema / properties / lang / anyOfAdded value: +[ + { + "pattern": "^[a-z]{3}$", + "type": "string" + }, + { + "items": { + "pattern": "^[a-z]{3}$", + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / lang / descriptionPrevious 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." - removed
Input schema / properties / lang / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / lang / typeRemoved value: -"array" - added
Input schema / properties / location_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / location_uris / descriptionPrevious 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." - removed
Input schema / properties / location_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / location_uris / typeRemoved value: -"array" - added
Input schema / properties / source_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / source_uris / descriptionPrevious 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." - removed
Input schema / properties / source_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / source_uris / typeRemoved value: -"array"
- Changed
search_events21 fields changed- added
Input schema / properties / category_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / category_uris / descriptionPrevious 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." - removed
Input schema / properties / category_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / category_uris / typeRemoved value: -"array" - added
Input schema / properties / concept_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / concept_uris / descriptionPrevious 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." - removed
Input schema / properties / concept_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / concept_uris / typeRemoved value: -"array" - changed
Input schema / properties / keyword / descriptionPrevious 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." - added
Input schema / properties / lang / anyOfAdded value: +[ + { + "pattern": "^[a-z]{3}$", + "type": "string" + }, + { + "items": { + "pattern": "^[a-z]{3}$", + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / lang / descriptionPrevious 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." - removed
Input schema / properties / lang / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / lang / typeRemoved value: -"array" - added
Input schema / properties / location_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / location_uris / descriptionPrevious 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." - removed
Input schema / properties / location_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / location_uris / typeRemoved value: -"array" - added
Input schema / properties / source_uris / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / source_uris / descriptionPrevious 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." - removed
Input schema / properties / source_uris / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / source_uris / typeRemoved value: -"array"
- Changed
suggest_concepts4 fields changed- added
Input schema / properties / types / anyOfAdded value: +[ + { + "enum": [ + "person", + "loc", + "org", + "wiki" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "person", + "loc", + "org", + "wiki" + ], + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / types / descriptionPrevious 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." - removed
Input schema / properties / types / itemsRemoved value: -{ - "enum": [ - "person", - "loc", - "org", - "wiki" - ], - "type": "string" -} - removed
Input schema / properties / types / typeRemoved value: -"array"
- Changed
suggest_sources4 fields changed- added
Input schema / properties / data_types / anyOfAdded value: +[ + { + "enum": [ + "news", + "pr", + "blog" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "news", + "pr", + "blog" + ], + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / data_types / descriptionPrevious 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." - removed
Input schema / properties / data_types / itemsRemoved value: -{ - "enum": [ - "news", - "pr", - "blog" - ], - "type": "string" -} - removed
Input schema / properties / data_types / typeRemoved value: -"array"
10 tool updates
v1.0.0- First observed
get_article - First observed
get_event - First observed
get_trending_concepts - First observed
get_usage - First observed
search_articles - First observed
search_events - First observed
suggest_categories - First observed
suggest_concepts - First observed
suggest_locations - First observed
suggest_sources
TDQS
Scored across 10 tools
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.
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.
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.
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
Related MCP Connectors
Live news search: what was published in the last hours and days on any topic, in 45 languages, with duplicate coverage grouped and every story checked for relevance. One read-only tool, search_news; sign in with OAuth (a free account with 50 search credits is created when you connect).
Real-time corroborated news events + 5-year archive, for agents. Free tier, no key.
Crypto news, perps, market pulse, price history and token checks for AI agents. USDC per call.
121Search global news in natural language. Filter by language, country, date, sentiment, and domain.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides 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.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search news articles, get top headlines, and browse sources via the NewsAPI.org service.MIT

newspaper-mcpofficial
AlicenseNot gradedqualityCmaintenanceEnables 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- AlicenseNot gradedqualityCmaintenanceEnables 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