basic-mcp-server
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 IAundCybersécurité et agents IA. Exakte Kategorieübereinstimmung ist fast nutzlos, daher matchtsearch_newsKategorien als case-insensitive Teilzeichenfolge.viewsist für jede ZeileNULL. 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 |
| Suche nach Freitext, Kategorie, Tags und Datumsbereich; paginiert |
Tool |
| Ein Artikel vollständig, per |
Tool |
| Verschiedene Kategorien mit Anzahl, zur Entdeckung |
Tool |
| Verschiedene |
Tool |
| Abdeckung: Summen, Datumsbereich, Volumen pro Monat, Hauptthemen |
Resource |
| Korpusgröße, Datumsbereich und Top-Tags als JSON |
Prompt |
| 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, Lebenszyklusmcp-server.js– der MCP-Server: Tools, Resource, Promptdb.js– Postgres-Pool und der schreibgeschützte Query-Helperauth.js– Bearer-Token-Verifizierunginspect-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/mcpDATABASE_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:
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 (
tagsvs.key_wordsinlist_tags) wird durch eine Zod-Enum eingeschränkt, bevor er verwendet wird.Postgres verweigert Schreibvorgänge. Jede Abfrage läuft innerhalb von
BEGIN READ ONLYmit einemSET LOCAL statement_timeout(db.js).SET LOCALstatt 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 rowsFü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 startMit 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 |
|
Falsches Token |
|
Token ohne |
|
Korrektes Präfix des echten Tokens |
|
Korrektes Token |
|
|
|
Konfiguration
Env-Var | Standard | Zweck |
| — | Erforderlich. Supabase-Postgres-Verbindungszeichenfolge |
| — | Fallback, wenn |
| — | Nicht gesetzt ⇒ offen für alle; gesetzt ⇒ Bearer-Token erforderlich |
|
| Listen-Port |
|
| Bind-Adresse. Setzen Sie |
|
| Endpunktpfad |
|
| Poolgröße; klein halten, Pooler haben Verbindungslimits |
|
| Obergrenze pro Abfrage |
| — |
|
| — | 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/mcpMit 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.
This server cannot be installed
Maintenance
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
Remote MCP server exposing SMI Aware tools, resources, and skills over Streamable HTTP.
A Model Context Protocol server for Wix AI tools
Model Context Protocol server for Studex tools, notifications, and profile integrations
Model Context Protocol server for todo.vu task management and time tracking.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA simple implementation of a Model Context Protocol server that demonstrates core functionality including mathematical tools (add, subtract) and personalized greeting resources.93GPL 3.0
- FlicenseNot gradedqualityDmaintenanceA sample implementation of Model Context Protocol server demonstrating core functionality with simple arithmetic tools and greeting resources.
- FlicenseNot gradedqualityDmaintenanceA demonstration implementation of a Model Context Protocol server that provides simple mathematical tools (add, subtract) and personalized greeting resources.
- AlicenseNot gradedqualityDmaintenanceA 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.16ISC
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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