Skip to main content
Glama
ranydone

NewsAPI MCP Server

by ranydone
README.md
# NewsAPI MCP Server + Frontend POC

Two components:

* `mcp\_server.py`  — MCP server (stdio transport), connects Claude to NewsAPI
* `frontend.html`  — Standalone browser frontend, no install needed

\---

## Step 1 — Get your free NewsAPI key

1. Go to https://newsapi.org/register
2. Fill in name + email — takes 30 seconds
3. Copy the API key shown on the dashboard
4. 7ac03af867104a6096d1e320f49d5896

\---

## Step 2 — Install dependencies

```bash
pip install mcp httpx
```

That's all. No other packages needed.

\---

## Step 3 — Run the MCP server

```bash
# Set your key
export NEWS\_API\_KEY=your\_actual\_key\_here

# Run the server
python mcp\_server.py
```

The server listens on stdio (standard in/out). You'll see no output —
that's correct. It's waiting for an MCP client to connect.

To test it works:

```bash
NEWS\_API\_KEY=your\_key python -c "
import asyncio, json, sys
sys.path.insert(0, '.')
import mcp\_server
print('Server module loaded OK — 4 tools registered')
"
```

\---

## Step 4 — Open the frontend

Just double-click `frontend.html` in your file manager,
OR open it in your browser with:

```bash
# macOS
open frontend.html

# Linux
xdg-open frontend.html

# Windows
start frontend.html
```

Then:

1. Paste your NewsAPI key into the sidebar
2. Select a tool (search\_news / get\_top\_headlines / get\_sources / get\_tech\_briefing)
3. Enter a query and click Run

\---

## Step 5 — Connect to Claude Desktop (optional)

Find your Claude Desktop config file:

* macOS:   \~/Library/Application Support/Claude/claude\_desktop\_config.json
* Windows: %APPDATA%\\Claude\\claude\_desktop\_config.json

Add this block (replace paths and key):

```json
{
  "mcpServers": {
    "newsapi": {
      "command": "python",
      "args": \["/full/path/to/newsapi-mcp/mcp\_server.py"],
      "env": {
        "NEWS\_API\_KEY": "your\_actual\_key\_here"
      }
    }
  }
}
```

Restart Claude Desktop. You'll see "newsapi" appear in the tools menu.

Try asking Claude:

* "Search for the latest news on ServiceNow MCP announcements"
* "Get top technology headlines in the Netherlands"
* "Give me an enterprise AI briefing from the last week"

\---

## MCP Tools Reference

|Tool|Description|Key params|
|-|-|-|
|search\_news|Full-text search, 150k+ sources, last 5 years|query, language, sort\_by, page\_size|
|get\_top\_headlines|Live breaking news|country, category, query|
|get\_sources|List available publishers|category, language, country|
|get\_tech\_briefing|Curated preset briefings|topic (6 presets), custom\_query|

### Briefing topic presets

|Preset|Query used|
|-|-|
|servicenow|ServiceNow OR "service now" ITSM platform|
|enterprise\_architecture|enterprise architecture OR LeanIX OR TOGAF OR IT4IT|
|itsm|ITSM OR "IT service management" OR helpdesk ticketing|
|ai\_enterprise|enterprise AI OR "generative AI" OR LLM OR MCP|
|heineken\_beverage|Heineken OR "beer market" OR FMCG beverage|
|cloud\_azure|Microsoft Azure OR "Azure West Europe" OR cloud infra|

\---

## Free tier limits

* 100 requests/day on the free developer plan
* Results limited to articles from the last 30 days (upgrade for 5 years)
* No commercial use on free tier

\---

## Project structure

```
newsapi-mcp/
├── mcp\_server.py    ← MCP server (run this on terminal)
├── frontend.html    ← Browser UI (open directly, no server needed)
└── README.md
```

\---

## Extending to other APIs

The pattern is the same for any REST API:

1. Add a new `Tool(name=..., inputSchema=...)` in `list\_tools()`
2. Add a handler block in `call\_tool()` that does `await newsapi\_get(...)` or any httpx call
3. Return `\[TextContent(type="text", text=json.dumps(result))]`