Skip to main content
Glama
TahiryMSX

basic-mcp-server

by TahiryMSX

ai-news-mcp

Сервер Model Context Protocol, отвечающий на вопросы о корпусе новостей об ИИ, работающий через Streamable HTTP.

Это серверная часть данных для агента новостей об ИИ: агент задаёт вопросы, эти инструменты ищут и читают news.articles в Supabase Postgres.

Каждый инструмент доступен только для чтения. См. Гарантия только для чтения.

Не сохраняет состояние: каждый запрос получает собственный экземпляр MCP-сервера, между запросами ничего не хранится, поэтому нет идентификаторов сессий и нет привязки к конкретному узлу. Пул базы данных является общим.

Корпус

news.articles в Supabase Postgres. По состоянию на 2026-08-24:

Статьи

1083

Диапазон дат

2026-04-01 → 2026-08-24

Язык

французский

Различных категорий

668

Различных тегов

927

Два свойства определяют дизайн инструментов:

  • Категории — произвольный текст и фрагментированы — 668 различных значений на 1083 статьи, с почти дубликатами, такими как Cybersécurité, Cybersécurité des agents IA и Cybersécurité et agents IA. Точное совпадение категорий почти бесполезно, поэтому search_news сопоставляет категории как подстроку без учёта регистра.

  • views равно NULL для каждой строки. Намеренно нет инструмента «самое читаемое»; он возвращал бы шум.

Related MCP server: MCP Server Basic Example

Что он предоставляет

Тип

Имя

Описание

Инструмент

search_news

Поиск по произвольному тексту, категории, тегам и диапазону дат; с постраничной выдачей

Инструмент

get_article

Одна статья полностью, по id или article_url

Инструмент

list_categories

Различные категории с количеством, для обнаружения

Инструмент

list_tags

Различные tags или key_words с количеством

Инструмент

news_stats

Охват: итоги, диапазон дат, объём по месяцам, ведущие темы

Ресурс

news://overview

Размер корпуса, диапазон дат и основные теги в формате JSON

Промпт

ai_news_analyst

Обосновывает ответ в корпусе, с цитированием

search_news возвращает сводки, обрезанные до 320 символов — полные сводки быстро заполняют контекст модели. Вызовите get_article для полного текста одной статьи.

Файлы

  • index.js — HTTP(S)-хост: маршрутизация, проверка аутентификации, TLS, жизненный цикл

  • mcp-server.js — MCP-сервер: инструменты, ресурс, промпт

  • db.js — пул Postgres и вспомогательная функция запросов только для чтения

  • auth.js — проверка bearer-токена

  • inspect-cli.js — вспомогательный инструмент для разработки; запускает CLI MCP Inspector для этого сервера

Запуск

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 обязателен — сервер завершает работу с инструкциями, если он отсутствует. Используйте строку transaction pooler Supabase (порт 6543): панель управления → Connect → Transaction pooler.

Гарантия только для чтения

MCP-эндпоинт может быть открыт без аутентификации, поэтому «наш SQL выполняет только SELECT» — недостаточно сильная гарантия. Два независимых уровня:

  1. Ни один инструмент не принимает SQL. Все пять выполняют фиксированные операторы; ввод вызывающего кода всегда поступает только как связанные параметры, а единственный интерполируемый идентификатор (tags против key_words в list_tags) ограничен перечислением Zod перед использованием.

  2. Postgres запрещает запись. Каждый запрос выполняется внутри BEGIN READ ONLY с SET LOCAL statement_timeout (db.js). Используется SET LOCAL, а не SET на уровне сессии, потому что при пулинге транзакций настройка сессии просочилась бы к тому клиенту, которому этот бэкенд будет передан следующим.

Проверено на живой базе данных:

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

Для защиты в глубину укажите DATABASE_URL на выделенную роль только для чтения, а не на владельца:

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

Тогда ошибка в этом сервере не сможет записать данные, даже если защита транзакций будет удалена.

Аутентификация

Отключена, если не задан MCP_AUTH_TOKEN. Задайте его. Каждый инструмент читает вашу базу данных, поэтому открытый эндпоинт позволяет любому, кто найдёт URL, запрашивать корпус и расходовать вашу квоту Supabase. Стартовый баннер предупреждает, когда токен отсутствует.

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

При заданном токене запросы должны содержать Authorization: Bearer <token>. Схема нечувствительна к регистру; токен — нет. Отсутствующие или неверные учётные данные дают 401 и вызов WWW-Authenticate, сравнение выполняется за постоянное время (обе стороны SHA-256, затем timingSafeEqual), чтобы токен нельзя было восстановить по времени ответов.

Токены короче 32 символов вызывают предупреждение при запуске — токен, защищающий базу данных, не должен быть запоминающимся словом. Используйте gen-token.

GET /health никогда не требует учётных данных, поэтому работает как проверка работоспособности платформы.

Проверенное поведение:

Запрос

Результат

Нет заголовка Authorization

401 + WWW-Authenticate: Bearer

Неверный токен

401 + error="invalid_token"

Токен без префикса Bearer

401

Правильный префикс настоящего токена

401

Правильный токен

200

GET /health, без учётных данных

200

Конфигурация

Переменная окружения

По умолчанию

Назначение

DATABASE_URL

Обязательно. Строка подключения Supabase Postgres

DIRECT_URL

Запасной вариант, если DATABASE_URL не задан

MCP_AUTH_TOKEN

Не задан ⇒ открыт для всех; задан ⇒ требуется bearer-токен

PORT

8080

Порт прослушивания

HOST

0.0.0.0

Адрес привязки. Установите 127.0.0.1 для локального доступа

MCP_PATH

/mcp

Путь эндпоинта

PGPOOL_MAX

4

Размер пула; держите небольшим, у пулеров есть лимиты подключений

PG_STATEMENT_TIMEOUT_MS

8000

Потолок на запрос

PGSSL_STRICT

1 проверяет сертификат сервера (нужен CA Supabase)

TLS_KEY / TLS_CERT

Пути к PEM-файлам; оба заданы ⇒ HTTPS

Попробуйте с curl

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}}}'

Добавьте -H "authorization: Bearer $MCP_AUTH_TOKEN", если вы задали токен.

Попробуйте в Inspector

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"

Веб-интерфейс (npm run inspect) требует Transport Streamable HTTP и URL http://127.0.0.1:8080/mcp. Если вы задали токен, заполните Authentication → Header Name Authorization, значение Bearer <token> — иначе Inspector увидит 401, предположит OAuth и запустит процесс обнаружения, который этот сервер не реализует.

Подключите к агенту

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

С токеном добавьте --header "Authorization: Bearer <token>".

Промпт ai_news_analyst — предполагаемая точка входа для агента: он указывает модели искать перед ответом, искать на французском независимо от языка вопроса, цитировать article_url и прямо говорить, когда в корпусе ничего нет, а не прибегать к общим знаниям.

Поиск по французскому тексту

Поиск использует полнотекстовый поиск Postgres с конфигурацией french, которая обрабатывает стемминг и стоп-слова. Он не сворачивает акценты, потому что расширение unaccent не установлено в этой базе данных — energie не совпадёт с énergie.

Чтобы это исправить, выполните один раз в редакторе SQL Supabase и измените FTS в mcp-server.js:

CREATE EXTENSION IF NOT EXISTS unaccent;

При 1083 строках каждый запрос — быстрое последовательное сканирование, поэтому индекс пока не нужен. Если корпус вырастет за ~50 тыс. строк, добавьте GIN-индекс на выражение to_tsvector.

Развёртывание

Сейчас работает на Render. См. DEPLOYMENT.md для настроек этого сервиса, шагов повторного развёртывания и особенностей платформы.

Установите DATABASE_URL — и в идеале MCP_AUTH_TOKEN — в настройках окружения хоста. Никогда не коммитьте их; .gitignore покрывает .env и *.pem.

Сервер привязывается к 0.0.0.0 и учитывает переданный PORT, что требуется контейнерным платформам. Процесс, привязанный к 127.0.0.1, недоступен извне своего контейнера, даже если его журналы выглядят здоровыми.

Добавление собственного инструмента

В mcp-server.js и направьте запрос через вспомогательную функцию только для чтения:

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) }] };
  }
);

Никогда не создавайте SQL конкатенацией ввода вызывающего кода и никогда не добавляйте инструмент, принимающий SQL в качестве аргумента — это отдало бы поверхность чтения корпуса любому, кто может достичь эндпоинта.

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