basic-mcp-server
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
Что он предоставляет
Тип | Имя | Описание |
Инструмент |
| Поиск по произвольному тексту, категории, тегам и диапазону дат; с постраничной выдачей |
Инструмент |
| Одна статья полностью, по |
Инструмент |
| Различные категории с количеством, для обнаружения |
Инструмент |
| Различные |
Инструмент |
| Охват: итоги, диапазон дат, объём по месяцам, ведущие темы |
Ресурс |
| Размер корпуса, диапазон дат и основные теги в формате JSON |
Промпт |
| Обосновывает ответ в корпусе, с цитированием |
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/mcpDATABASE_URL обязателен — сервер завершает работу с инструкциями, если он отсутствует. Используйте
строку transaction pooler Supabase (порт 6543): панель управления → Connect →
Transaction pooler.
Гарантия только для чтения
MCP-эндпоинт может быть открыт без аутентификации, поэтому «наш SQL выполняет только SELECT» — недостаточно сильная гарантия. Два независимых уровня:
Ни один инструмент не принимает SQL. Все пять выполняют фиксированные операторы; ввод вызывающего кода всегда поступает только как связанные параметры, а единственный интерполируемый идентификатор (
tagsпротивkey_wordsвlist_tags) ограничен перечислением Zod перед использованием.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 никогда не требует учётных данных, поэтому работает как проверка работоспособности платформы.
Проверенное поведение:
Запрос | Результат |
Нет заголовка |
|
Неверный токен |
|
Токен без префикса |
|
Правильный префикс настоящего токена |
|
Правильный токен |
|
|
|
Конфигурация
Переменная окружения | По умолчанию | Назначение |
| — | Обязательно. Строка подключения Supabase Postgres |
| — | Запасной вариант, если |
| — | Не задан ⇒ открыт для всех; задан ⇒ требуется bearer-токен |
|
| Порт прослушивания |
|
| Адрес привязки. Установите |
|
| Путь эндпоинта |
|
| Размер пула; держите небольшим, у пулеров есть лимиты подключений |
|
| Потолок на запрос |
| — |
|
| — | Пути к 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 в качестве аргумента — это отдало бы поверхность чтения корпуса любому, кто может достичь эндпоинта.
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