Skip to main content
Glama
TahiryMSX

basic-mcp-server

by TahiryMSX

ai-news-mcp

一个模型上下文协议服务器,用于回答关于 AI 新闻语料库的问题,通过 Streamable HTTP 提供服务。

它是 AI 新闻代理的数据后端:代理提出问题,这些工具在 Supabase Postgres 中搜索并读取 news.articles

每个工具都是只读的。 参见只读保证

无状态:每个请求获得自己的 MCP 服务器实例,请求之间不保留任何内容,因此没有会话 ID,也没有粘性路由。数据库连接池是共享的。

语料库

news.articles,位于 Supabase Postgres 中。截至 2026-08-24:

文章数

1083

日期范围

2026-04-01 → 2026-08-24

语言

法语

不同类别数

668

不同标签数

927

两个属性驱动了工具设计:

  • 类别是自由文本且碎片化的 —— 1083 篇文章中有 668 个不同的值,存在近似重复项,如 CybersécuritéCybersécurité des agents IACybersécurité et agents IA。精确的类别匹配几乎无用,因此 search_news 将类别匹配为不区分大小写的子串

  • 每一行的 views 都是 NULL 故意没有"最多阅读"工具;它会返回噪声。

Related MCP server: MCP Server Basic Example

它暴露的内容

类型

名称

描述

工具

search_news

按自由文本、类别、标签和日期范围搜索;分页

工具

get_article

idarticle_url 获取一篇完整文章

工具

list_categories

带计数的不同类别,用于发现

工具

list_tags

带计数的不同 tagskey_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 —— 开发辅助工具;针对此服务器运行 MCP Inspector CLI

运行

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 是必需的 —— 如果缺失,服务器会退出并给出说明。使用 Supabase 事务池化连接字符串(端口 6543):仪表盘 → Connect → Transaction pooler。

只读保证

MCP 端点可能在没有认证的情况下暴露,因此"我们的 SQL 只做 SELECT"不是一个足够强的保证。两个独立的层:

  1. 没有工具接受 SQL。 所有五个工具都运行固定语句;调用者的输入只作为绑定参数到达,唯一被插值的标识符(list_tags 中的 tagskey_words)在使用前由 Zod 枚举约束。

  2. Postgres 拒绝写入。 每个查询都在 BEGIN READ ONLY 内运行,并带有 SET LOCAL statement_timeoutdb.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;

这样即使事务保护被移除,此服务器中的 bug 也无法写入。

认证

默认关闭,除非设置了 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>。方案不区分大小写;令牌区分大小写。缺失或错误的凭据会得到 401WWW-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 验证服务器证书(需要 Supabase CA)

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"

Web 界面(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

要修复此问题,请在 Supabase SQL 编辑器中运行一次,并调整 mcp-server.js 中的 FTS

CREATE EXTENSION IF NOT EXISTS unaccent;

在 1083 行的情况下,每个查询都是快速的顺序扫描,因此目前不需要索引。如果语料库增长超过约 5 万行,请在 to_tsvector 表达式上添加 GIN 索引。

部署

目前部署在 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