Finance News MCP Server
by nheimm
README.md
# Finance News MCP Server
Ein **Model Context Protocol (MCP) Server** für Finanznachrichten, der echte Nachrichten von NewsAPI abruft und strukturierte, zusammengefasste Antworten liefert.
## Features
- 🔍 **Nachrichtensuche**: Volltextsuche über Finanznachrichten
- 📰 **Top Headlines**: Aktuelle Schlagzeilen nach Land und Kategorie
- 📡 **Quellenverzeichnis**: Liste der verfügbaren News-Quellen
- 📊 **Strukturierte Output**: JSON mit Bullet-Points und Zusammenfassungen
---
## Schnellstart
### 1. Virtualenv + Abhängigkeiten
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
```
**macOS/Linux-Spezifika:**
- Falls `python` nicht existiert, nutze `python3`
- `source` für Bash/Zsh (nicht Windows PowerShell)
### 2. .env Datei erstellen
```bash
cp .env.example .env
```
Öffne `.env` und trage deine **NewsAPI** Credentials ein:
```
NEWS_API_KEY=dein_api_key_von_newsapi_org
```
[NewsAPI Key besorgen](https://newsapi.org/register) (kostenlos mit täglichem Limit).
### 3. Server starten
```bash
python mcp_server.py
```
Erwartet einen MCP-Client, der über STDIO Anfragen sendet.
---
## Testing & Debugging
### Option A: Direkt die Handler testen
Führe die Handler-Funktionen direkt auf, ohne STDIO zu nutzen:
```bash
python test_handlers.py
```
**Nützlich für:**
- Schnelle Funktionstests
- Debugging ohne External-Dependencies
- API-Antworten prüfen
### Option B: Mit dem STDIO-Client testen
Starte den Server als Unterprozess und kommuniziere per JSON-RPC:
```bash
python stdio_client.py
```
**Beispiele mit verschiedenen Parametern:**
```bash
# Standard-Ausführung (Apple earnings, US, englisch, 3 Ergebnisse)
python stdio_client.py
# Andere Suchanfrage
python stdio_client.py --search "Tesla stock"
# Mit Land und Sprache
python stdio_client.py --search "Fed interest rate" --country gb --language de
# Mehr Ergebnisse
python stdio_client.py --country us --page-size 10
# Deutsche Quellen
python stdio_client.py --language de --country de
# Bitcoin News aus Großbritannien
python stdio_client.py --search "Bitcoin" --country gb
# Hilfe anzeigen
python stdio_client.py --help
```
---
## STDIO Client Parameter
Der `stdio_client.py` akzeptiert folgende Argumente:
| Parameter | Typ | Default | Beispiel | Beschreibung |
|-----------|-----|---------|----------|-------------|
| `--search` | text | "Apple earnings" | `--search "Tesla"` | Suchanfrage für Finanznachrichten |
| `--country` | text | "us" | `--country gb` | Ländercode (ISO 3166-1 alpha-2) für Headlines |
| `--language` | text | "en" | `--language de` | Sprachcode (ISO 639-1) für Quellen |
| `--page-size` | integer | 3 | `--page-size 10` | Anzahl Ergebnisse (1-50) |
### Wie der Parser funktioniert
Der `argparse.ArgumentParser` in `stdio_client.py` verarbeitet Kommandozeilen-Argumente:
```python
parser.add_argument("--search", type=str, default=None,
help='Search query for finance news')
```
Das bedeutet:
- `--search` ist der Schalter
- `type=str` erwartet einen Text-String
- `default=None` = wenn nicht angegeben, ist der Wert `None`
- In `main()` wird mit `or` ein Fallback-Wert gesetzt
**Praktisch:**
```bash
# Mit Argumenten
python stdio_client.py --search "Bitcoin" --country de
# Ohne Argumente
python stdio_client.py # nutzt alle Defaults
```
---
## Response-Struktur
Typische Antwort bei `search_finance_news`:
```json
{
"metadata": {
"query": "Apple earnings",
"language": "en",
"sort_by": "publishedAt",
"total_results": 5
},
"articles": [
{
"title": "Apple Q2 Earnings Beat Expectations",
"source": "Bloomberg",
"url": "https://...",
"published_at": "2026-05-30T14:00:00Z",
"summary": "• Apple beat earnings estimates\n• Revenue up 12% YoY\n• Services segment grew 15%",
"key_points": [
"Apple beat earnings estimates",
"Revenue up 12% YoY",
"Services segment grew 15%"
]
}
]
}
```
---
## Tools
Der Server implementiert 3 MCP-Tools:
### 1. search_finance_news
Volltextsuche über Finanznachrichten.
**Parameter:**
- `query` (erforderlich): Suchanfrage, z.B. "Apple earnings", "Fed rate", "Bitcoin"
- `language` (optional): ISO 639-1 Code (default: "en")
- `page_size` (optional): 1-50 (default: 5)
- `sort_by` (optional): "relevancy", "popularity", "publishedAt" (default: "publishedAt")
### 2. get_top_finance_headlines
Aktuelle Top-Headlines nach Land/Kategorie.
**Parameter:**
- `country` (optional): ISO 3166-1 alpha-2 Code, z.B. "us", "gb", "de"
- `category` (optional): "business", "technology", etc. (default: "business")
- `page_size` (optional): 1-50 (default: 5)
### 3. get_finance_sources
Liste der verfügbaren Nachrichtenquellen.
**Parameter:**
- `language` (optional): ISO 639-1 Code
- `country` (optional): ISO 3166-1 Code
- `category` (optional): Nachrichtenkategorie
---
## Projektstruktur
```
mcp_server/
├── mcp_server.py # MCP Server (Haupt-Einstiegspunkt)
├── stdio_client.py # Test-Client mit Kommandozeilen-Args
├── test_handlers.py # Direkte Handler-Tests (ohne STDIO)
├── test_news_api.py # Debug-Skript für NewsAPI
├── news_client.py # NewsAPI HTTP-Client
├── models.py # Pydantic Modelle für Validierung
├── summarizer.py # Artikel→Bullet-Points Transformation
├── config.py # Konfiguration (Env Vars)
├── pyproject.toml # Package-Metadaten & Dependencies
├── .env.example # Beispiel Env-Datei
└── README.md # Diese Datei
```
---
## Beispiel-Kommandos
```bash
# Nachrichten zu Tesla suchen
python stdio_client.py --search "Tesla" --page-size 5
# Top Headlines Großbritannien
python stdio_client.py --country gb --page-size 10
# Fed & Zinsen (mit Deutsche Quellen)
python stdio_client.py --search "Federal Reserve" --language de
# Kryptowährungen weltweit
python stdio_client.py --search "Bitcoin crypto" --page-size 15
# Test aller Tools auf einmal
python stdio_client.py
```
---
## Lizenz & Credits
- **NewsAPI**: [newsapi.org](https://newsapi.org)
- **MCP Protocol**: [Model Context Protocol](https://modelcontextprotocol.io/)
- **FastAPI/Pydantic**: Type-safe Python
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues