{
  "markdown": "<div align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"assets/logo-dark.svg\">\n    <img src=\"assets/logo.svg\" alt=\"APITube\" width=\"320\">\n  </picture>\n\n<h1>APITube News MCP</h1>\n\n<p><strong>Real-time and archived news search for AI agents, over the Model Context Protocol.</strong></p>\n<p>Hosted at <code>https://mcp.apitube.io/</code> — no package to install, no local process to keep alive.</p>\n\n<p>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-blue?style=flat-square\" alt=\"License: MIT\"></a>\n  <img src=\"https://img.shields.io/badge/transport-Streamable%20HTTP-0254EC?style=flat-square\" alt=\"Transport: Streamable HTTP\">\n  <img src=\"https://img.shields.io/badge/MCP%20protocol-2025--11--25-0254EC?style=flat-square\" alt=\"MCP protocol 2025-11-25\">\n  <img src=\"https://img.shields.io/badge/tools-2-success?style=flat-square\" alt=\"2 tools\">\n  <img src=\"https://img.shields.io/badge/sources-500%2C000%2B-success?style=flat-square\" alt=\"300,000+ sources\">\n  <img src=\"https://img.shields.io/badge/languages-59-success?style=flat-square\" alt=\"59 languages\">\n</p>\n\n<p>\n  <a href=\"#quick-start\">Quick Start</a> •\n  <a href=\"#tools\">Tools</a> •\n  <a href=\"#filters\">Filters</a> •\n  <a href=\"#prompts\">Prompts</a> •\n  <a href=\"#pricing\">Pricing</a> •\n  <a href=\"#troubleshooting\">Troubleshooting</a> •\n  <a href=\"#documentation\">Docs</a> •\n  <a href=\"#support\">Support</a>\n</p>\n\n<p><strong>300,000+ sources · 177 countries · 59 languages.</strong> Sentiment and entities on every article.</p>\n\n</div>\n\n---\n\n## Overview\n\nThe APITube MCP server gives an assistant live access to the world's news as structured data, not\nscraped HTML. It exposes **2 tools**:\n\n- **`search_news`** — most of the News API filter set in one call: keywords, language, country, source\n  domain and quality rank, sentiment range, named entities, media, date ranges, sorting, faceting\n  and highlighting.\n- **`suggest`** — resolves a name like \"Tesla\" into the entity, category, topic and industry IDs the\n  precise filters need.\n\nEvery article comes back enriched by the pipeline behind it: sentiment scores, extracted entities\n(people, organizations, locations, brands, events), IPTC categories, topics and industries.\n\n```\nMCP client  →  mcp.apitube.io  →  api.apitube.io\n               (this server)      (News API)\n\nJSON-RPC over HTTP, Authorization: Bearer <API_KEY>\n```\n\n| Property | Value |\n|----------|-------|\n| **Endpoint** | `https://mcp.apitube.io/` |\n| **Transport** | Streamable HTTP (`POST /`), JSON-RPC 2.0 |\n| **Protocol** | `2025-11-25`, negotiated down to your client's version (`2024-11-05` works) |\n| **Server** | `APITube News MCP-Server` `1.0.0` |\n| **Auth** | `Authorization: Bearer <API_KEY>`, or `X-API-Key: <API_KEY>` |\n| **Registry** | `io.apitube/news` ([`server.json`](server.json)) |\n\n## Quick Start\n\n1. Get an API key at [apitube.io](https://apitube.io).\n2. Add the server to your client with the block below — each one is also a ready file in\n   [`configs/`](configs).\n3. Restart the client and ask it something like *\"find positive breaking news about Tesla in English\n   from the last week\"*.\n\n<details>\n<summary><b>Claude Code</b></summary>\n\n```bash\nclaude mcp add --transport http apitube-news https://mcp.apitube.io/ \\\n  --header \"Authorization: Bearer YOUR_API_KEY\"\n```\n\nCheck it with `/mcp`. To commit the server to a project instead, put\n[`configs/claude-code.mcp.json`](configs/claude-code.mcp.json) at the repo root as `.mcp.json`.\n\n</details>\n\n<details>\n<summary><b>Cline</b></summary>\n\n**MCP Servers → Configure**, or `~/.cline/mcp.json` for the CLI:\n\n```json\n{\n  \"mcpServers\": {\n    \"apitube-news\": {\n      \"type\": \"streamableHttp\",\n      \"url\": \"https://mcp.apitube.io/\",\n      \"headers\": { \"Authorization\": \"Bearer YOUR_API_KEY\" },\n      \"disabled\": false,\n      \"autoApprove\": []\n    }\n  }\n}\n```\n\n`type` must be set explicitly — without it Cline falls back to the legacy SSE transport, which this\nserver does not serve. Both tools are read-only, so `autoApprove: [\"search_news\", \"suggest\"]` is\nsafe if you would rather not confirm every call.\n\n</details>\n\n<details>\n<summary><b>Cursor</b></summary>\n\n`~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (per project):\n\n```json\n{\n  \"mcpServers\": {\n    \"apitube-news\": {\n      \"url\": \"https://mcp.apitube.io/\",\n      \"headers\": { \"Authorization\": \"Bearer YOUR_API_KEY\" }\n    }\n  }\n}\n```\n\nSettings → MCP should list `apitube-news` as connected.\n\n</details>\n\n<details>\n<summary><b>Claude Desktop</b></summary>\n\nClaude Desktop only launches local processes, so bridge the hosted server with\n[`mcp-remote`](https://www.npmjs.com/package/mcp-remote). Edit `claude_desktop_config.json`\n(`~/Library/Application Support/Claude/` on macOS, `%APPDATA%\\Claude\\` on Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"apitube-news\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"mcp-remote\",\n        \"https://mcp.apitube.io/\",\n        \"--header\",\n        \"Authorization: Bearer YOUR_API_KEY\"\n      ]\n    }\n  }\n}\n```\n\nRestart the app; the tools appear under the slider icon.\n\n</details>\n\n<details>\n<summary><b>VS Code (GitHub Copilot)</b></summary>\n\n`.vscode/mcp.json`, with the key prompted instead of stored in plain text:\n\n```json\n{\n  \"inputs\": [\n    { \"type\": \"promptString\", \"id\": \"apitube-key\", \"description\": \"APITube API Key\", \"password\": true }\n  ],\n  \"servers\": {\n    \"apitube-news\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.apitube.io/\",\n      \"headers\": { \"Authorization\": \"Bearer ${input:apitube-key}\" }\n    }\n  }\n}\n```\n\nOpen Copilot Chat in **Agent** mode and enable the `apitube-news` tools.\n\n</details>\n\n<details>\n<summary><b>Windsurf</b></summary>\n\n`~/.codeium/windsurf/mcp_config.json` — note `serverUrl`, not `url`:\n\n```json\n{\n  \"mcpServers\": {\n    \"apitube-news\": {\n      \"serverUrl\": \"https://mcp.apitube.io/\",\n      \"headers\": { \"Authorization\": \"Bearer YOUR_API_KEY\" }\n    }\n  }\n}\n```\n\nWindsurf Settings → Cascade → MCP Servers → refresh.\n\n</details>\n\n<details>\n<summary><b>Any other client, or plain curl</b></summary>\n\nAnything that speaks Streamable HTTP takes the URL directly; clients limited to stdio go through\n`mcp-remote`, as in the Claude Desktop block. The handshake needs no key:\n\n```bash\ncurl -s -X POST https://mcp.apitube.io/ \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"curl\",\"version\":\"1.0.0\"}},\"id\":1}'\n```\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"protocolVersion\": \"2024-11-05\",\n    \"serverInfo\": { \"name\": \"APITube News MCP-Server\", \"version\": \"1.0.0\" },\n    \"capabilities\": { \"tools\": { \"listChanged\": true }, \"prompts\": { \"listChanged\": true } }\n  }\n}\n```\n\nA real search adds the key:\n\n```bash\ncurl -s -X POST https://mcp.apitube.io/ \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"search_news\",\"arguments\":{\"title\":\"Bitcoin\",\"language\":{\"code\":\"en\"},\"per_page\":5}},\"id\":1}'\n```\n\n</details>\n\n## Tools\n\n| Tool | Title | Kind | What it does |\n|------|-------|------|--------------|\n| `search_news` | News Search | read-only | Searches articles across the News API filter set |\n| `suggest` | Resolve Taxonomy IDs | read-only | Turns a name or prefix into entity / category / topic / industry IDs |\n\n### `search_news`\n\nArguments are **nested objects**, never dotted strings:\n\n```jsonc\n{ \"language\": { \"code\": \"en\" } }      // ✅\n{ \"language.code\": \"en\" }             // ❌ rejected\n```\n\nThree things worth knowing before the first call:\n\n- **The article body is not returned by default.** The default field list is\n  `id,title,href,published_at,description,source.domain`. Ask for the text explicitly with\n  `fl: \"title,href,body\"`.\n- **One response carries at most 25 articles.** `per_page` defaults to 10 and is clamped to 25; walk\n  further with `page`. If a result set still has to be cut — 25 articles of full text can be large — the\n  response gains an `_mcp_truncated` field saying how many were omitted.\n- **A title search spans at most 31 days.** With no dates it covers the last 31 days; a wider explicit\n  range fails with `400 ER0110`. Split longer periods into month-sized windows. Searches without a\n  title filter have no range limit.\n\nMisspelled arguments are **rejected** with JSON-RPC `-32602` and a suggestion, instead of being\nsilently ignored:\n\n```\nUnknown parameter 'langauge.code'. Did you mean 'language.code'?\n```\n\n`export`, `query` and `prompt` are deliberately not exposed.\n\n### `suggest`\n\nThe precise filters take IDs you cannot guess, so resolve them first:\n\n```jsonc\nsuggest({ type: \"entities\", prefix: \"Tesla\" })\n// → [{ id: 474, name: \"Tesla Robotaxi\", type: \"brand\", … }, …]\n\nsearch_news({ entity: { id: \"474\" }, language: { code: \"en\" } })\n```\n\n`type` is one of `entities`, `categories`, `topics`, `industries`; `prefix` is a name or its\nbeginning. Both are required. Matching is by prefix, so read the names before filtering on the\nfirst hit.\n\n## Filters\n\nEverything below belongs to `search_news`. Content, taxonomy, language, author and source filters\nhave an `ignore.*` twin for exclusion (`ignore.title`, `ignore.entity.id`, `ignore.source.domain`, …);\nsentiment, media and time filters do not. Multi-value filters take up to 3 comma-separated values.\n`has_*` and `is_*` take `0` or `1`, not `true`/`false`.\n\n<details open>\n<summary><b>Content and taxonomy</b></summary>\n\n| Argument | Example |\n|----------|---------|\n| `title` | `\"Bitcoin\"` — up to 3 comma-separated keywords, quotes for an exact phrase |\n| `category.id` | `\"medtop:04000000\"` — IPTC taxonomy |\n| `topic.id` | `\"industry.crypto_news\"` — slug, from `suggest` |\n| `industry.id` | `\"411\"` — numeric, from `suggest` |\n| `entity.id` | `\"474\"` — from `suggest` |\n| `person.name` · `organization.name` · `location.name` | `\"Elon Musk\"` · `\"Tesla,Apple\"` · `\"Tokyo\"` |\n| `brand.name` · `event.name` · `disaster.name` · `disease.name` | `\"Nike\"` · `\"Olympics\"` · `\"Earthquake\"` · `\"COVID-19\"` |\n| `author.id` · `author.name` · `has_author` | `\"123\"` · `\"Jane Smith\"` · `1` |\n| `language.code` | `\"en,de,fr\"` |\n\n</details>\n\n<details>\n<summary><b>Sentiment</b></summary>\n\n| Argument | Example |\n|----------|---------|\n| `sentiment.overall.polarity` | `\"positive\"` \\| `\"negative\"` \\| `\"neutral\"` |\n| `sentiment.overall.score.{min,max}` | `-1.0` … `1.0` |\n| `sentiment.title.score` · `sentiment.body.score` | same range, headline or body only |\n| `sentiment.mixed` · `sentiment.consistent` | `1` — title and body disagree / agree |\n\n</details>\n\n<details>\n<summary><b>Sources and quality</b></summary>\n\n| Argument | Example |\n|----------|---------|\n| `source.domain` · `source.id` | `\"cnn.com,bbc.com\"` · `\"314\"` |\n| `source.country.code` | `\"us,uk,de\"` |\n| `source.bias` | `\"left\"` \\| `\"center\"` \\| `\"right\"` |\n| `source.rank.opr.{min,max}` | OpenPageRank, 0–7 |\n| `is_premium_source` · `is_verified_source` | OPR ≥ 6 · OPR ≥ 5 |\n| `is_duplicate` · `is_paywall` | `0` to exclude |\n\n</details>\n\n<details>\n<summary><b>Media, shape and time</b></summary>\n\n| Argument | Example |\n|----------|---------|\n| `has_image` · `has_video` · `has_hq_images` · `is_media_rich` | `1` |\n| `media.images.count.{min,max}` · `media.images.{width,height}` · `media.videos.count` | `{ \"min\": 2 }` |\n| `is_breaking` · `is_long_read` · `is_short_read` | `1` — read time ≥ 5 min / < 3 min |\n| `read_time.{min,max}` | minutes |\n| `published_at.{start,end}` | `\"2026-01-01\"` … `\"2026-01-31\"`, ISO 8601 |\n\n</details>\n\n<details>\n<summary><b>Output: sorting, paging, faceting, highlighting</b></summary>\n\n| Argument | Example |\n|----------|---------|\n| `sort.by` | `published_at`, `relevance`, `engagement`, `quality`, `controversy`, `trust`, `source.rank.opr`, `sentiment.*.score`, `media.*`, `read_time`, … |\n| `sort.order` | `\"asc\"` \\| `\"desc\"` |\n| `page` · `per_page` | `1` · `10` (max 25) |\n| `fl` | `\"id,title,source.name,sentiment.overall.score\"` — dot notation for nested fields |\n| `facet` | `true`, or `{ \"field\": \"source.id,language.id\", \"limit\": 20, \"mincount\": 5 }` |\n| `facet.range` | `{ \"field\": \"published_at\", \"start\": \"2026-01-01\", \"end\": \"2026-12-31\", \"gap\": \"1MONTH\" }` |\n| `hl` | `true`, or `{ \"fl\": \"title,body\", \"fragsize\": 300, \"tag\": { \"pre\": \"<mark>\", \"post\": \"</mark>\" } }` |\n\n</details>\n\n## Prompts\n\nSlash commands in clients that support MCP prompts:\n\n| Prompt | Arguments | What it does |\n|--------|-----------|--------------|\n| `monitor_company` | `company` (required), `days` | Recent coverage and sentiment for one company |\n| `topic_sentiment` | `topic` (required), `language` | Sentiment breakdown of coverage on a topic |\n| `breaking_news` | `subject`, `country` | Latest breaking stories, optionally narrowed |\n| `compare_coverage` | `subject_a`, `subject_b` (both required) | Volume and sentiment, two subjects side by side |\n\n## Use cases\n\n| You want to | Ask for | Tools |\n|-------------|---------|-------|\n| Watch a brand across languages | mentions of the company with sentiment, last 7 days | `suggest` → `search_news` |\n| Feed a trading or risk model | entity + industry filtered news with sentiment scores | `suggest` → `search_news` |\n| Ground an agent in live news | recent articles with `fl: \"title,href,body\"` for RAG | `search_news` |\n| Track a running story | `is_breaking: 1`, sorted by `published_at` | `search_news` |\n| Measure share of voice | two subjects compared by volume and sentiment | `compare_coverage` |\n| Study an archive | a date range with no title filter — no 31-day limit | `search_news` |\n\n## Pricing\n\nThe MCP server is part of the paid plans; the free tier covers the REST API only.\n\n| Plan | Price | Requests | MCP server |\n|------|-------|----------|------------|\n| Free | $0 | 100/day | — |\n| Starter | $29/mo | 10,000/mo | ✅ |\n| Basic | $99/mo | 50,000/mo | ✅ |\n| Professional | $199/mo | 150,000/mo | ✅ |\n\nAnnual billing takes 20% off. Current numbers always live at [apitube.io/pricing](https://apitube.io/pricing).\n\nPage size is capped separately: through MCP one response holds at most 25 articles on every plan,\nregardless of the larger `per_page` the REST API allows.\n\n## Troubleshooting\n\nAuth and transport failures arrive as JSON-RPC `-32000` with an APITube code in the message and the\nmatching HTTP status.\n\n| Code | HTTP | Meaning | Fix |\n|------|------|---------|-----|\n| `ER0201` | 401 | No API key reached the server | The header is missing, or the client strips custom headers — use the `mcp-remote` bridge |\n| `ER0202` | 401 | Key invalid or revoked | Re-copy it from apitube.io |\n| `ER0230` | 401 | Key expired | Extend the expiry in the key's settings |\n| `ER0601` / `ER0602` | 403 | IP or referrer not allowed for this key | Adjust the key's restrictions |\n| `ER0603` | 403 | Key not permitted to call this tool | Grant it access to `search_news` / `suggest` |\n| `ER0429` | 429 | Over 120 requests/minute | Slow down — the limit is per key |\n| `ER0900` | 503 | Key validation temporarily unavailable | Retry; the key is fine, do not reissue it |\n\n<details>\n<summary><b>Other symptoms</b></summary>\n\n| Symptom | Cause |\n|---------|-------|\n| Client reconnects in a loop | It opened a `GET` SSE stream. Expected: the server answers `405 Allow: POST` because it has no event stream, and compliant clients fall back to `POST` |\n| `-32602` with a suggested name | Misspelled argument — arguments are nested objects, never dotted keys |\n| `403` from a Python script | The default `Python-urllib/3.x` user agent is rejected at the edge. Send a real `User-Agent`, or use `requests` |\n| Search returns nothing for an old story | A title search only covers 31 days. Add `published_at` and walk month by month |\n| Articles arrive without text | The body is excluded by default. Add `fl: \"title,href,body\"` |\n\n</details>\n\n## Documentation\n\n| Resource | Link |\n|----------|------|\n| MCP server reference | https://docs.apitube.io/platform/news-api/ai/mcp-server |\n| Editor setup, one-click install links | https://docs.apitube.io/platform/news-api/ai/code-editors |\n| All News API parameters | https://docs.apitube.io/platform/news-api/everything |\n| Authentication | https://docs.apitube.io/platform/news-api/authentication |\n| Machine-readable server card | https://docs.apitube.io/.well-known/mcp/server-card.json |\n| Agent skill, SDKs, migration kits | https://github.com/apitube |\n| Installing this server as an agent | [`llms-install.md`](llms-install.md) |\n\n## Registry\n\nPublished in the [official MCP Registry](https://registry.modelcontextprotocol.io) from\n[`server.json`](server.json) in this repository:\n\nmcp-name: io.apitube/news\n\nSee more on [Claude Market's MCP directory](https://www.claudemarket.ai/mcp).\n\n## Support\n\n| Channel | Where |\n|---------|-------|\n| Bugs and corrections | [open an issue](https://github.com/apitube/news-api-mcp/issues) |\n| Account and billing | support@apitube.io |\n| Everything else | https://apitube.io/contact |\n\nFound an argument that behaves differently from what is written here? Open an issue with the request\nyou sent and the response you got — those corrections are the most useful thing you can file.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n",
  "bytes": 17245,
  "sha": "4794b6e32888d6a90ae707194f58c1beab39fcc9a329486d15b9256f9d0c38c7",
  "repo_slug": "apitube/news-api-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_apitube_news_4c7852e7/readme"
}