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 в качестве аргумента — это отдало бы поверхность чтения корпуса любому, кто может достичь эндпоинта.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A simple implementation of a Model Context Protocol server that demonstrates core functionality including mathematical tools (add, subtract) and personalized greeting resources.
    98
    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.
    14 npm
    ISC
  • F
    license
    Not graded
    quality
    A
    maintenance
    A minimal Model Context Protocol server exposing arithmetic, time, and note-taking tools over streamable HTTP, with in-memory state and Docker support.
    -