Skip to main content
Glama
TahiryMSX

basic-mcp-server

by TahiryMSX

ai-news-mcp

Ein Model Context Protocol-Server, der Fragen zu einem KI-Nachrichtenkorpus beantwortet und über Streamable HTTP bereitgestellt wird.

Er ist das Daten-Backend für einen KI-Nachrichtenagenten: Der Agent stellt Fragen, diese Tools durchsuchen und lesen news.articles in Supabase Postgres.

Jedes Tool ist schreibgeschützt. Siehe Read-only-Garantie.

Zustandslos: Jede Anfrage erhält ihre eigene MCP-Serverinstanz, nichts wird zwischen Anfragen gespeichert, also keine Session-IDs und kein Sticky-Routing. Der Datenbank-Pool wird gemeinsam genutzt.

Der Korpus

news.articles, in einer Supabase Postgres. Stand 2026-08-24:

Artikel

1083

Datumsbereich

2026-04-01 → 2026-08-24

Sprache

Französisch

Verschiedene Kategorien

668

Verschiedene Tags

927

Zwei Eigenschaften bestimmen das Tool-Design:

  • Kategorien sind Freitext und fragmentiert – 668 verschiedene Werte bei 1083 Artikeln, mit Fast-Duplikaten wie Cybersécurité, Cybersécurité des agents IA und Cybersécurité et agents IA. Exakte Kategorieübereinstimmung ist fast nutzlos, daher matcht search_news Kategorien als case-insensitive Teilzeichenfolge.

  • views ist für jede Zeile NULL. Es gibt bewusst kein „Meistgelesen"-Tool; es würde Rauschen liefern.

Related MCP server: MCP Server Basic Example

Was es bereitstellt

Art

Name

Beschreibung

Tool

search_news

Suche nach Freitext, Kategorie, Tags und Datumsbereich; paginiert

Tool

get_article

Ein Artikel vollständig, per id oder article_url

Tool

list_categories

Verschiedene Kategorien mit Anzahl, zur Entdeckung

Tool

list_tags

Verschiedene tags oder key_words mit Anzahl

Tool

news_stats

Abdeckung: Summen, Datumsbereich, Volumen pro Monat, Hauptthemen

Resource

news://overview

Korpusgröße, Datumsbereich und Top-Tags als JSON

Prompt

ai_news_analyst

Verankert eine Antwort im Korpus, mit Zitaten

search_news gibt Zusammenfassungen zurück, die auf 320 Zeichen gekürzt sind – vollständige Zusammenfassungen füllen den Kontext eines Modells schnell. Rufen Sie get_article für den vollständigen Text eines Artikels auf.

Dateien

  • index.js – HTTP(S)-Host: Routing, Auth-Prüfung, TLS, Lebenszyklus

  • mcp-server.js – der MCP-Server: Tools, Resource, Prompt

  • db.js – Postgres-Pool und der schreibgeschützte Query-Helper

  • auth.js – Bearer-Token-Verifizierung

  • inspect-cli.js – Dev-Helper; führt die MCP-Inspector-CLI gegen diesen Server aus

Ausführen

npm install
cp .env.example .env     # then set DATABASE_URL
npm start
# ai-news-mcp listening on http://0.0.0.0:8080/mcp

DATABASE_URL ist erforderlich – der Server beendet sich mit Anweisungen, wenn sie fehlt. Verwenden Sie die Supabase-Transaction-Pooler-Zeichenfolge (Port 6543): Dashboard → Connect → Transaction pooler.

Read-only-Garantie

Der MCP-Endpunkt kann ohne Authentifizierung exponiert sein, daher ist „unser SQL macht nur SELECTs" keine ausreichende Garantie. Zwei unabhängige Ebenen:

  1. Kein Tool akzeptiert SQL. Alle fünf führen feste Anweisungen aus; Eingaben des Aufrufers kommen nur als gebundene Parameter an, und der eine interpolierte Bezeichner (tags vs. key_words in list_tags) wird durch eine Zod-Enum eingeschränkt, bevor er verwendet wird.

  2. Postgres verweigert Schreibvorgänge. Jede Abfrage läuft innerhalb von BEGIN READ ONLY mit einem SET LOCAL statement_timeout (db.js). SET LOCAL statt eines Session-Level-SET, weil unter Transaction-Pooling eine Session-Einstellung an den nächsten Client durchsickern würde, dem dieses Backend übergeben wird.

Gegen die Live-Datenbank verifiziert:

INSERT  blocked: cannot execute INSERT in a read-only transaction
UPDATE  blocked: cannot execute UPDATE in a read-only transaction
DELETE  blocked: cannot execute DELETE in a read-only transaction
DDL     blocked: cannot execute CREATE TABLE in a read-only transaction
SELECT  still works: 1083 rows

Für Defense in Depth setzen Sie DATABASE_URL auf eine dedizierte Read-only-Rolle statt auf den Owner:

CREATE ROLE mcp_reader LOGIN PASSWORD '...';
GRANT USAGE ON SCHEMA news TO mcp_reader;
GRANT SELECT ON news.articles TO mcp_reader;

Dann kann ein Fehler in diesem Server nicht schreiben, selbst wenn die Transaktionssperre entfernt würde.

Authentifizierung

Aus, außer MCP_AUTH_TOKEN ist gesetzt. Setzen Sie es. Jedes Tool liest Ihre Datenbank, daher lässt ein offener Endpunkt jeden, der die URL findet, den Korpus abfragen und Ihr Supabase-Kontingent verbrennen. Das Startbanner warnt, wenn das Token fehlt.

npm run gen-token          # prints a random 32-byte hex token (64 chars)
MCP_AUTH_TOKEN=<token> npm start

Mit gesetztem Token benötigen Anfragen Authorization: Bearer <token>. Das Schema ist case-insensitive; das Token nicht. Fehlende oder falsche Anmeldedaten ergeben 401 und eine WWW-Authenticate-Herausforderung, die in konstanter Zeit verglichen wird (beide Seiten SHA-256-gehasht, dann timingSafeEqual), sodass das Token nicht durch Timing der Antworten rekonstruiert werden kann.

Token, die kürzer als 32 Zeichen sind, lösen eine Startwarnung aus – ein Token, das eine Datenbank schützt, sollte kein einprägsames Wort sein. Verwenden Sie gen-token.

GET /health erfordert nie eine Anmeldedaten, funktioniert also als Plattform-Health-Check.

Verifiziertes Verhalten:

Anfrage

Ergebnis

Kein Authorization-Header

401 + WWW-Authenticate: Bearer

Falsches Token

401 + error="invalid_token"

Token ohne Bearer -Präfix

401

Korrektes Präfix des echten Tokens

401

Korrektes Token

200

GET /health, ohne Anmeldedaten

200

Konfiguration

Env-Var

Standard

Zweck

DATABASE_URL

Erforderlich. Supabase-Postgres-Verbindungszeichenfolge

DIRECT_URL

Fallback, wenn DATABASE_URL nicht gesetzt ist

MCP_AUTH_TOKEN

Nicht gesetzt ⇒ offen für alle; gesetzt ⇒ Bearer-Token erforderlich

PORT

8080

Listen-Port

HOST

0.0.0.0

Bind-Adresse. Setzen Sie 127.0.0.1 für nur lokal

MCP_PATH

/mcp

Endpunktpfad

PGPOOL_MAX

4

Poolgröße; klein halten, Pooler haben Verbindungslimits

PG_STATEMENT_TIMEOUT_MS

8000

Obergrenze pro Abfrage

PGSSL_STRICT

1 verifiziert das Serverzertifikat (benötigt die Supabase-CA)

TLS_KEY / TLS_CERT

Pfade zu PEM-Dateien; beide gesetzt ⇒ HTTPS

Mit curl ausprobieren

curl -X POST http://127.0.0.1:8080/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_news","arguments":{"query":"Nvidia","limit":3}}}'

Fügen Sie -H "authorization: Bearer $MCP_AUTH_TOKEN" hinzu, wenn Sie ein Token gesetzt haben.

Im Inspector ausprobieren

npm run inspect:cli -- --method tools/list
npm run inspect:cli -- --method tools/call --tool-name news_stats
npm run inspect:cli -- --method tools/call --tool-name search_news --tool-arg query=Anthropic
npm run inspect:cli -- --method resources/read --uri "news://overview"

Die Web-UI (npm run inspect) benötigt Transport Streamable HTTP und URL http://127.0.0.1:8080/mcp. Wenn Sie ein Token gesetzt haben, füllen Sie Authentication → Header-Name Authorization, Wert Bearer <token> aus – sonst sieht der Inspector das 401, nimmt OAuth an und startet einen Discovery-Flow, den dieser Server nicht implementiert.

Mit einem Agenten verbinden

claude mcp add --transport http ai-news https://ai-news-mcp.onrender.com/mcp

Mit einem Token fügen Sie --header "Authorization: Bearer <token>" hinzu.

Der ai_news_analyst-Prompt ist der vorgesehene Einstiegspunkt für einen Agenten: Er weist das Modell an, vor dem Antworten zu suchen, auf Französisch zu suchen, unabhängig von der Sprache der Frage, article_url zu zitieren und klar zu sagen, wenn der Korpus nichts enthält, statt auf Allgemeinwissen zurückzugreifen.

Französischen Text durchsuchen

Die Suche verwendet die Postgres-Volltextsuche mit der french-Konfiguration, die Stemming und Stoppwörter behandelt. Sie faltet nicht Akzente, weil die unaccent-Erweiterung auf dieser Datenbank nicht installiert ist – energie wird nicht énergie matchen.

Um das zu beheben, führen Sie einmal im Supabase-SQL-Editor aus und passen Sie FTS in mcp-server.js an:

CREATE EXTENSION IF NOT EXISTS unaccent;

Bei 1083 Zeilen ist jede Abfrage ein schneller sequenzieller Scan, daher ist noch kein Index nötig. Wenn der Korpus über ~50k Zeilen wächst, fügen Sie einen GIN-Index auf den to_tsvector-Ausdruck hinzu.

Bereitstellen

Derzeit live auf Render. Siehe DEPLOYMENT.md für die Einstellungen dieses Dienstes, Redeploy-Schritte und Plattform-Eigenheiten.

Setzen Sie DATABASE_URL – und idealerweise MCP_AUTH_TOKEN – in den Umgebungseinstellungen des Hosts. Committen Sie sie nie; .gitignore deckt .env und *.pem ab.

Der Server bindet 0.0.0.0 und respektiert ein injiziertes PORT, was Container-Plattformen erfordern. Ein Prozess, der an 127.0.0.1 gebunden ist, ist von außerhalb seines Containers nicht erreichbar, auch wenn seine Logs gesund aussehen.

Eigenes Tool hinzufügen

In mcp-server.js, und leiten Sie die Abfrage durch den schreibgeschützten Helper:

import { query } from "./db.js";

server.registerTool(
  "my_tool",
  {
    title: "My tool",
    description: "What it does — the model reads this to decide when to call it.",
    inputSchema: { term: z.string() },
  },
  async ({ term }) => {
    const rows = await query("SELECT id, title FROM news.articles WHERE title ILIKE $1", [`%${term}%`]);
    return { content: [{ type: "text", text: JSON.stringify(rows, null, 2) }] };
  }
);

Bauen Sie niemals SQL durch Verketten von Aufrufereingaben, und fügen Sie niemals ein Tool hinzu, das SQL als Argument akzeptiert – das würde die Leseoberfläche des Korpus jedem übergeben, der den Endpunkt erreichen kann.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

0Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A simple implementation of a Model Context Protocol server that demonstrates core functionality including mathematical tools (add, subtract) and personalized greeting resources.
    93
    GPL 3.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    A demonstration implementation of a Model Context Protocol server that provides simple mathematical tools (add, subtract) and personalized greeting resources.
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that provides basic tools for arithmetic operations (addition) and dynamic greeting resources, demonstrating MCP integration patterns for other projects and clients.
    16
    ISC

View all related MCP servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TahiryMSX/ai-news-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server