Hottub News
Worldwide news for agents: search, sync and story clusters across outlets and languages. No key.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"hottub-news": {
"url": "https://hottub.news/mcp"
}
}
}Remote endpoints
https://hottub.news/mcpstreamable-httpWhat it can do
Tool inventory
Tools (9)
🟢search_news(lang, country, topic, source, kind, ...)
Newest-first headlines from worldwide sources, optionally filtered by words, language, country, topic, source, kind and time.
Input Schema
{
"type": "object",
"properties": {
"lang": {
"type": "string",
"description": "Comma-separated ISO 639-1 codes, e.g. \"en,es\""
},
"country": {
"type": "string",
"description": "Comma-separated ISO 3166-1 alpha-2 codes of the publisher's country, e.g. \"US,GB\""
},
"topic": {
"type": "string",
"description": "Comma-separated topics, e.g. \"space,science\""
},
"source": {
"type": "string",
"description": "Comma-separated source ids (see list_sources) or publisher domains"
},
"kind": {
"type": "string",
"description": "Comma-separated: article, press_release, official, community, research, sponsored"
},
"category": {
"type": "string",
"description": "Comma-separated IPTC top-level categories: arts-culture-entertainment, conflict-war, crime-law, disaster-accident, economy-business, education, environment, health, human-interest, labour, lifestyle-leisure, politics, religion, science-technology, society, sport, weather"
},
"sentiment": {
"type": "string",
"description": "Comma-separated: negative, neutral, positive"
},
"political": {
"type": "boolean",
"description": "true: political stories only (political score ≥ 0.5); false: non-political only"
},
"tone_min": {
"type": "number",
"minimum": -1,
"maximum": 1,
"description": "Only items with tone ≥ this (-1 most negative … 1 most positive)"
},
"tone_max": {
"type": "number",
"minimum": -1,
"maximum": 1
},
"since": {
"type": "string",
"description": "Only items published at/after this: RFC 3339, a date, or an age like \"6h\", \"2d\""
},
"until": {
"type": "string",
"description": "Only items published at/before this"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
},
"sponsored": {
"type": "string",
"enum": [
"include",
"exclude",
"only"
],
"default": "include",
"description": "Paid press releases are labeled; exclude to omit them"
},
"format": {
"type": "string",
"enum": [
"md",
"lines",
"ndjson",
"json"
],
"default": "md",
"description": "md: readable with summaries; lines: tab-separated, fewest tokens; ndjson/json: full records"
},
"q": {
"type": "string",
"description": "What you're looking for, in any language. Matches by meaning and by keyword (hybrid) over the last 7 days unless since is given; results carry a relevance score."
},
"match": {
"type": "string",
"enum": [
"hybrid",
"keyword",
"semantic"
],
"default": "hybrid",
"description": "keyword: exact words only; semantic: meaning only (cross-language)"
},
"entity": {
"type": "string",
"description": "Comma-separated Wikidata ids (from find_entities), e.g. \"Q312\""
},
"collapse": {
"type": "string",
"enum": [
"story"
],
"description": "One item per story (best representative); related = other reports of it"
},
"sort": {
"type": "string",
"enum": [
"newest",
"hot",
"positive",
"negative"
],
"default": "newest",
"description": "hot: most widely covered stories of the last 48h, one per story; positive/negative: most positive/negative tone first (last 24h unless since is given)"
},
"before": {
"type": "string",
"description": "Paging cursor from a previous result's next link"
}
},
"additionalProperties": false
}🟢sync_news(lang, country, topic, source, kind, ...)
Incremental feed: returns items added after `after`, oldest first, plus a new cursor. Call again with that cursor to get only what is new.
Input Schema
{
"type": "object",
"properties": {
"lang": {
"type": "string",
"description": "Comma-separated ISO 639-1 codes, e.g. \"en,es\""
},
"country": {
"type": "string",
"description": "Comma-separated ISO 3166-1 alpha-2 codes of the publisher's country, e.g. \"US,GB\""
},
"topic": {
"type": "string",
"description": "Comma-separated topics, e.g. \"space,science\""
},
"source": {
"type": "string",
"description": "Comma-separated source ids (see list_sources) or publisher domains"
},
"kind": {
"type": "string",
"description": "Comma-separated: article, press_release, official, community, research, sponsored"
},
"category": {
"type": "string",
"description": "Comma-separated IPTC top-level categories: arts-culture-entertainment, conflict-war, crime-law, disaster-accident, economy-business, education, environment, health, human-interest, labour, lifestyle-leisure, politics, religion, science-technology, society, sport, weather"
},
"sentiment": {
"type": "string",
"description": "Comma-separated: negative, neutral, positive"
},
"political": {
"type": "boolean",
"description": "true: political stories only (political score ≥ 0.5); false: non-political only"
},
"tone_min": {
"type": "number",
"minimum": -1,
"maximum": 1,
"description": "Only items with tone ≥ this (-1 most negative … 1 most positive)"
},
"tone_max": {
"type": "number",
"minimum": -1,
"maximum": 1
},
"since": {
"type": "string",
"description": "Only items published at/after this: RFC 3339, a date, or an age like \"6h\", \"2d\""
},
"until": {
"type": "string",
"description": "Only items published at/before this"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
},
"sponsored": {
"type": "string",
"enum": [
"include",
"exclude",
"only"
],
"default": "include",
"description": "Paid press releases are labeled; exclude to omit them"
},
"format": {
"type": "string",
"enum": [
"md",
"lines",
"ndjson",
"json"
],
"default": "md",
"description": "md: readable with summaries; lines: tab-separated, fewest tokens; ndjson/json: full records"
},
"after": {
"type": "integer",
"description": "The cursor returned by your previous sync_news call; 0 to start from the oldest retained item"
}
},
"required": [
"after"
],
"additionalProperties": false
}🟢list_stories(limit, lang, country, category, entity, ...)
The most widely covered stories right now (last 48h), each with a neutral multi-source brief when available, outlet count, languages, entities and a representative report. Filter by lang, country, category, entity.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 15
},
"lang": {
"type": "string"
},
"country": {
"type": "string"
},
"category": {
"type": "string"
},
"entity": {
"type": "string"
},
"format": {
"type": "string",
"enum": [
"md",
"json"
],
"default": "md"
}
},
"additionalProperties": false
}🟢find_entities(q)
Look up Wikidata ids for a name (e.g. "Tesla", "Lagos") with how many items mention each in the last 7 days; pass the id as `entity` to search_news or list_stories.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string"
}
},
"required": [
"q"
],
"additionalProperties": false
}🟢get_story(story, format)
Every item in a story (the `story` id on items, st_…): all outlets and languages covering the same event, newest first.
Input Schema
{
"type": "object",
"properties": {
"story": {
"type": "string"
},
"format": {
"type": "string",
"enum": [
"md",
"lines",
"ndjson",
"json"
],
"default": "md"
}
},
"required": [
"story"
],
"additionalProperties": false
}🟢get_news_item(id)
Full record for one item id (n_… for news, s_… for sponsored).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}🟢list_sources(q, country, lang)
Registered sources with their language, country, kind and health. Filter by q (name), country or lang.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string"
},
"country": {
"type": "string"
},
"lang": {
"type": "string"
}
},
"additionalProperties": false
}🟢quote_placement(topics, lang, country, days)
Quote for placing a labeled, paid press release in the Hottub News mix via Hottub Business. Price varies by topic tier, current topic interest, demand, targeting reach and duration; the response itemizes each factor. Read-only: returns a price; books and charges nothing.
Input Schema
{
"type": "object",
"properties": {
"topics": {
"type": "string",
"description": "Comma-separated topics to target, e.g. \"ai,business\"; omit for run of network"
},
"lang": {
"type": "string"
},
"country": {
"type": "string"
},
"days": {
"type": "integer",
"minimum": 1,
"maximum": 31,
"default": 7
}
},
"additionalProperties": false
}🟢news_stats
Item counts over the last 24 hours by kind, language, country and source, plus the current sync cursor.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}Community
Evidence