关于 NewsBlog Composer
NewsBlog Composer 是用于新闻博客创作的 MCP 服务,从经核实的新闻来源提取事实、挖掘关键词并协助整理发布材料。它要求至少两个独立发布者佐证,并将文章撰写留给用户选择的模型。
主要功能
- 01核实新闻并识别转载来源
- 02提取带来源链接的事实与引语
- 03从来源文本挖掘 SEO 关键词
- 04检查 SEO、AEO 与陈词滥调
- 05生成 JSON-LD 和发布材料
- 06建议相关的站内链接
适用场景
- 01将已核实的新闻整理成博客文章
- 02为草稿生成 SEO 与 AEO 检查结果
- 03为博客文章准备结构化数据和发布包
MCP 相关
向 MCP 客户端提供新闻核实、事实提取、关键词分析、草稿检查和发布材料生成等工具。支持 stdio,也可通过 HTTP 供远程客户端连接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx newsblog-composer-mcpTAVILY_API_KEY密钥Optional. Search provider; keyless GDELT is used when absent.GPTZERO_API_KEY密钥Optional. Real AI-detection reading; without it no detection score is reported.CLOUDFLARE_ACCOUNT_IDOptional. Image generation via Workers AI.CLOUDFLARE_API_TOKEN密钥Optional. Image generation via Workers AI.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
20收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
输入一条新闻标题或一个主题,它会核实新闻是否属实、下载来源、提取带有出处说明的事实、挖掘关键词、撰写文章,并围绕文章构建 SEO、结构化数据、横幅提示词和发布材料包。
"Write me a blog post about <a headline from today>"
verify_news 8 independent publishers, corroborated
fetch_article_facts facts, quotes and figures, each with its source URL
seo_keywords mined from the fetched text, not invented
draft_brief structure + facts -> the article gets written
find_ai_words stock phrasing flagged with the sentence it sits in
build_publishing_pack asks YOU which of 8 banner styles you want
build_schema NewsArticle + FAQPage JSON-LD, validated
seo_audit 93/100, nothing must-fix
save_and_present the post, the checks, the image prompt, the files
没有 Claude 订阅?通过命令行使用
扩展、连接器和技能都需要付费 Claude 套餐,因此免费账户无法使用它们。但这个工具可以。
看看流水线实际执行的工作:核实、双发布方规则、电讯稿和转发检测、事实提取、关键词挖掘、SEO 评分、AEO 评分、JSON-LD 和发布材料包,这些都由普通 Python 完成。只有一个步骤需要大模型——撰写草稿——而你已经可以免费使用一个大模型,无论你使用哪款聊天机器人。
因此,你可以自行提供大模型,只需粘贴:
pip install newsblog-composer-mcp
newsblog setup # byline, voice, blog URL. Once.
newsblog find "ransomware attack" # what is worth writing about today
newsblog brief "<headline>" # verifies, fetches, writes brief.md
将 brief.md 粘贴到任意聊天机器人中。把它生成的内容保存为 draft.md。然后:
newsblog pack draft.md --banner hardware_macro
这会审核草稿,评估其 SEO 和 AEO 表现,构建两个 JSON-LD 区块,并生成完整材料包,其中包括可粘贴到 Blogger 的文件。
对于科技、AI 或安全类新闻,无需 API 密钥:内置的发布方源不需要密钥。newsblog doctor --probe --feeds 会报告已配置的内容以及实际可访问的内容。
它唯一不会做的事,就是根据未经核实的新闻撰写文章。这种拒绝是产品的特性,而不是此入口的限制。
它实际能保证什么
至少有两家相互独立的发布方,否则不会起草。 系统会检测转载,因此六家媒体刊登同一篇 Reuters 报道时,不会被误认为有六个来源;日期跨度过大也会降低可信度,而不是悄无声息地放行。
**每条事实都能追溯到它获取的来源,**而不是模型的记忆。事实、引语和数据都会附带 source_url,并且 build_schema 会拒绝指向聚合器重定向链接而非真实发布方 URL 的引用链接。
横幅由你选择。 如果没有选择样式,结果中就不会有图片提示词,save_and_present 也会拒绝该内容包。工具会询问你,而不是替你决定。
没有数据就不会交付文章。 save_and_present 会拒绝交付,除非 SEO 审核和 AI 用语检查都已运行,因此最终文章总会附带评分。
两种评分,而非一种:SEO 和 AEO。 seo_audit 会同时返回两者。SEO 是页面内优化检查。AEO(Answer Engine Optimisation,答案引擎优化)关注的是:助手能否从页面中提取正确、完整的答案并加以引用,包括 40-60 词的开篇答案、问句式标题、简短段落、带来源的数据,以及清晰可见的常见问题解答。它关注结构,而非关键词;页面可能在其中一项得分很高,在另一项得分却很低。两项评分都会显示在 Checks 表中。
它会链接到你自己之前发布的文章,但只在确有依据时才这样做。 每篇文章都会记录在与你的个人资料放在一起的索引中,suggest_internal_links 会根据实体重合度和关键词重合度,将新草稿与索引内容进行匹配。低于相关性门槛时,它不会返回任何内容,因为不相关的内部链接还不如没有链接。这些是内部链接,而非反向链接:反向链接位于其他人的网站上,没有任何工具可以创建反向链接。
文章由机器撰写,工具会如实说明。 如果没有检测器 API 密钥,score_ai_text 会报告 Not measured,而不是编造一个令人安心的数字——本地风格评分衡量的是陈词滥调密度和句子节奏,并不能预测检测器会给出什么结果。如果署名要声称文章由某个人撰写,你应当在充分了解情况后自行决定;review_draft 的作用就是让草稿经过编辑,而不是未经修改就发布。
无需任何 API 密钥即可运行。 所有凭据都是可选升级,而非必需项。请参阅没有密钥?从这里开始。
安装
Claude Desktop — 一键安装,无需 Python
-
从 Releases 下载
newsblog-composer-<version>.mcpb。 -
在 Claude Desktop 中依次选择 Settings → Extensions → Advanced settings → Install Extension。
-
关闭再重新开启扩展。 在 Windows 上,X 按钮只会将窗口最小化到系统托盘,因此不执行此操作,旧服务就会继续运行。
-
将下面这行内容添加到 Claude 项目的说明中,或添加到 Customize,使其应用于每次聊天:
当我要求撰写博客文章、文章或新闻报道时,请始终使用 NewsBlog Composer 工具。请从
write_blog_post开始。不要自行搜索网页并起草文章。 -
请求撰写文章。工具会询问一次你的署名、公司和博客域名。
第 4 步不是可选项。 宿主的系统提示会将“给我写一篇博客文章”理解为“搜索网页并生成内容”,而 MCP 服务的 instructions 字段无法凌驾于此——服务没有声明优先级的 API。如果没有添加这行内容,客户端会根据网页搜索作答,完全不会提及此扩展。对于一次性请求,可以在请求中点名该服务。
扩展仅适用于桌面端。在移动端或 Web 应用中,没有可调用的工具,客户端会根据网页搜索作答,而且不会说明这一点。
从 PyPI 安装
pip install newsblog-composer-mcp
这会提供 newsblog-mcp 命令,该命令通过标准输入/输出与 MCP 通信。
从源代码安装
git clone https://github.com/Mohammed-Jameal-J/newsblog-composer-mcp.git
cd newsblog-composer-mcp
python3 -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
cp .env.example .env # optional: every value in it is optional too
将它接入客户端之前,请先检查它能否访问网络——如果代理或 VPN 阻止了搜索,你可以在这里发现:
python -m newsblog_mcp.diagnose "a headline you saw in the news today"
连接
VS Code
在工作区中创建 .vscode/mcp.json:
{
"servers": {
"newsblog": {
"type": "stdio",
"command": "newsblog-mcp"
}
}
}
重新加载窗口,然后在 Agent 模式下打开 Chat——工具会显示在工具选择器中。如果命令不在 PATH 中,请使用 newsblog-mcp 的完整路径(或使用虚拟环境中的 Python,并设置 "args": ["-m", "newsblog_mcp.server"])。
Claude Code
项目中的 .mcp.json:
{
"mcpServers": {
"newsblog": {
"command": "newsblog-mcp"
}
}
}
手动配置 Claude Desktop
Windows 上的 %APPDATA%\Claude\claude_desktop_config.json,
macOS 上的 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"newsblog": {
"command": "newsblog-mcp"
}
}
}
上述 .mcpb 会替你完成这些设置,而且是更简单的方式。
其他客户端
启动 newsblog-mcp(或 python -m newsblog_mcp.server),通过 stdio 使用 MCP。对于远程客户端,newsblog-mcp --http 会提供一个可流式传输的 HTTP 端点——请参阅发布和连接。
文件存放位置
如果不是通过源码检出安装——而是从 PyPI 安装,或作为 Claude Desktop 扩展一键安装——服务会将文件写入用户数据目录,因此升级时不会丢失任何内容:
| Windows | %LOCALAPPDATA%\newsblog-composer-mcp |
| macOS | ~/Library/Application Support/newsblog-composer-mcp |
| Linux | ~/.local/share/newsblog-composer-mcp |
该文件夹包含 profile.json(首次运行时设置的身份)、output/(所有生成的文章)和可选的 .env。设置 NEWSBLOG_DATA_DIR 可将它们放到其他位置。如果从克隆的检出目录运行,所有内容都会保留在项目文件夹中,也就是代码所在的位置。
这对扩展安装尤其重要。Claude Desktop 每次升级时都会整体替换扩展文件夹,因此任何写在代码旁边的内容都会在首次更新时被删除。在 0.5.2 之前确实如此,因为打包后的扩展包含 pyproject.toml 和 src/,看起来像开发者检出目录。现在它会写入上文所述的数据目录。
运行 python -m newsblog_mcp.diagnose 可输出安装对应的确切路径。
发布和连接
Claude Desktop / Claude Code 通过 stdio 运行服务,这也是上文安装部分配置的方式。
ChatGPT 无法启动本地进程,因此 stdio 永远无法连接到它。通过 HTTP 运行同一服务,并将其部署在 HTTPS 后面:
newsblog-composer-mcp --http --host 0.0.0.0 --port 8000
然后在 ChatGPT 中依次选择:Settings → Connectors → Advanced → Developer mode,再点击 Add custom connector,并将其指向 https://your-host/mcp。自定义连接器需要 Pro、Team、Enterprise 或 Edu 计划。
发布到 MCP Registry 需要先将软件包发布到 PyPI,然后使用本仓库中的 server.json 和 mcp-publisher CLI。以下四项必须匹配,否则发布会被拒绝:
name必须与经过身份验证的 GitHub 账户匹配:io.github.<username>/newsblog-composerdescription不得超过 100 个字符packages[].version必须是已发布到 PyPI 的版本- README 必须单独一行包含
mcp-name: <that same name>。注册表通过读取 PyPI 为该确切版本提供的描述来验证软件包所有权,因此标记必须包含在你上传的版本中,而不能只存在于仓库中。它是本文件顶部的 HTML 注释。
如何测试
分为三个等级,按成本从低到高排列。
1. 离线,无需联网——验证逻辑。
python tests\smoke_test.py
272 项检查,涵盖架构一致性、SEO 审核、AI 用词检测、聚合器链接背后的发布方身份、聚类、发布包、派生图片概念、商标过滤器和安装路径。所有检查应在约 2 秒内通过。
2. 联网——验证搜索能否找到你。
python -m newsblog_mcp.diagnose "a headline you saw in the news today"
每个提供方输出一行,包含耗时,随后给出结论。你应该能看到 independent_publishers 列出几个真实媒体,reference_candidates 中包含真实发布方的 URL。
3. 完整端到端生成一篇文章。
python examples\build_today_example.py
使用文件中已有的事实,根据真实新闻构建完整的内容包;写入输出文件夹前,会打印关键词、架构验证结果、AI 用词检查结果、人工评分和 SEO 评分。可将其作为一次良好运行的参考。examples\build_mistral_example.py 对手写参考文章执行相同操作。
4. 在 Claude Desktop 中,重启后进行测试。像平常一样提出请求即可——无需指定工具:
给我写一篇关于“<今天的一条真实新闻标题>”的博客文章
服务应通过调用 write_blog_post 作出响应,然后调用 verify_news,并完成整个流程,最后在 artifact 中呈现文章,并在聊天中打印发布详情。
如果客户端搜索网络并自行编写 Markdown 文件,说明扩展没有触发。请按顺序检查以下两项:
-
“设置” → “扩展”中显示扩展已启用。请注意,在 Windows 上关闭窗口只会将其最小化到系统托盘——请先关闭再重新开启扩展,以重新启动服务。
-
**告诉客户端优先使用它。**宿主自己的系统提示词通常会将“给我写一篇博客文章”理解为“搜索网络并创建 artifact”,而 MCP 服务的
instructions无法可靠地覆盖这一点。解决方法在客户端一侧:在 Claude 项目的说明或全局偏好设置中添加类似下面的内容,并在该项目中进行操作——当我要求撰写博客文章、文章或新闻稿时,始终使用 NewsBlog Composer 工具。从
write_blog_post开始。切勿自行搜索网络并起草文章。这对于本地 MCP 服务来说很常见;临时请求时直接指定服务名称也同样有效。
扩展仅适用于桌面端。在手机或 Web 应用中,没有可调用的扩展,客户端会根据网络搜索作答,但不会说明这一点。
隐私
服务在你自己的计算机上运行。不会向此软件包的作者发送任何内容,也不会进行任何形式的遥测。
仅在工具运行期间,以下内容会离开你的计算机:
- 你提供的标题或主题会发送给当前启用的新闻搜索提供方。如果未配置密钥,则会使用 GDELT 以及 Bing 和 Google News RSS 源。如果设置了提供方密钥,则会发送给相应的提供方。
- 文章 URL会直接从托管文章的发布方获取,方式与你的浏览器发出请求相同。
- 你的草稿文本仅在你设置了
GPTZERO_API_KEY或SAPLING_API_KEY时才会发送给 AI 检测器;仅在你调用generate_image时才会发送给图片生成器。如果没有这些密钥,这两种用途都不会将文本发送到你的计算机之外。
以下内容会保留在你的计算机上:首次运行时设置的发布身份(profile.json)、每篇生成的文章(output/)以及你配置的所有密钥。具体路径请参阅文件保存位置。该文件夹中的任何内容都不会上传到任何地方。
可选 API 密钥从环境变量或扩展的设置面板中读取。它们仅用于向所属的提供方进行身份验证。
这些工具
| 工具 | 功能 | 需要密钥? |
|---|---|---|
capabilities | 报告哪些提供方正常运行,以及正在使用哪些备用方案 | 否 |
write_blog_post | 入口工具。有人要求撰写博客文章时,就调用它;它会返回有序计划 | 否 |
find_stories | 将主题转化为当天的真实新闻,并按佐证程度和时效性分组、排序 | 否 |
verify_news | 搜索新闻提供方,保留匹配结果,并统计独立发布方数量 | 否(无密钥 RSS) |
fetch_article_facts | 下载来源,提取事实、注明出处的简短引语和数据 | 从不 |
draft_brief | 返回写作顺序:结构、有来源支撑的事实、关键词和 FAQ 候选问题 | 从不 |
review_draft | 阅读完成的草稿,并在发布前指出薄弱之处 | 从不 |
humanize_text | 可选的改写环节。优先使用 review_draft | 可选 |
find_ai_words | 找出每个常见 AI 短语及其所在句子 | 从不 |
score_ai_text | 本地风格评分。除非设置了检测器密钥,否则显示 Not measured | 可选 |
generate_image | 概念横幅图,先应用商标过滤器 | 否(带水印) |
seo_keywords | 从获取的来源中挖掘关键词;从 Google 自动补全中获取长尾和 FAQ 查询 | 否 |
seo_audit | 根据页面规则对完成的正文评分,并返回修正建议 | 从不 |
build_publishing_pack | 标题、标签、固定链接、替代文本,以及可直接粘贴使用的 Gemini 图像提示词 | 从不 |
build_schema | 生成 HTML 正文和两个 JSON-LD 区块,然后进行验证 | 从不 |
save_and_present | 将内容包写入 output/,并附上 canonical/OG/Twitter 标签 | 从不 |
资源:newsblog://house-style(起草步骤的结构和来源规则)以及 newsblog://humanizer-rules(改写规则集)。
工作流程
根据输入内容的不同,有两个入口。
一个主题 ——“今日 AI 新闻”“电动汽车”“印度金融科技”。目前还没有待验证的说法,所以先查明发生了什么:
find_stories("AI", days=1)
↓ stories grouped by event, ranked by publisher count then freshness
pick one from ready_to_write, check its age_hours
verify_news(story.headline)
↓ … and continue as below
一个具体标题 ——直接从 verify_news 开始。请注意,较旧的标题会正确返回较旧的来源;days 用于限制回溯范围。
verify_news(title)
↓ stop here if is_legit is false
fetch_article_facts(result.fetchable_urls) # or story.fetchable_urls
↓
seo_keywords(title, [fact.text for fact in facts])
↓ primary + secondary keywords, slug, meta title/description,
and FAQ questions taken from real autocomplete data
draft_brief(headline, facts, keywords)
↓ the writer writes the draft themselves
review_draft(draft, facts) → must_fix / worth_fixing / consider
↓ the writer revises; repeat until must_fix is empty
find_ai_words(draft) → until `clean` is true
↓
build_publishing_pack(...) → title, labels, permalink, Gemini image prompt
paste the prompt into Gemini, upload the image, take the public URL
↓
build_schema(article, faq, image, references, keywords)
↓ fix anything in validation.issues, then call again
seo_audit(html_body, primary_keyword, ...)
↓ fix everything in must_fix, then call again
save_and_present(..., meta=schema.meta, pack=pack)
输出会保存到 output/ 下按时间戳命名的文件夹中:
| 文件 | 内容 |
|---|---|
publish-pack.md | 标题、标签、自定义固定链接、搜索描述、替代文本、Gemini 图像提示词 |
paste-into-blogger.html | 两个 JSON-LD 区块和经过样式处理的正文——可直接粘贴的文件 |
report.md | 核验结论、人类评分、AI 词汇状态、SEO 评分、参考资料 |
index.html | 独立预览页,包含 meta、canonical、OG 和 Twitter 标签 |
body.html、*.jsonld、meta.json | 各个组成部分的单独文件 |
代码会强制执行三项防护措施,而不是把它们交给模型处理:
verify_news会返回is_legit: false,除非至少有两个独立发布方证实该标题,或有一个一手/官方来源证实。build_schema会通过validation.issues列出每一处不匹配:HTML 与 FAQPage schema 中的问题不一致、<img>标签与NewsArticle.image中的图片 URL 不一致、引用并非实际获取的 URL。列表非空就表示不要发布。seo_audit会针对确实会影响排名的问题返回must_fix——重复的 H1、开头缺少关键词、图片没有替代文本、meta description 长度不合适、外部来源链接少于两个。
fetch_article_facts 返回的每项内容都带有 source_url,因此完成文章中的任何说法都可以追溯到其来源页面。
没有密钥?从这里开始
即使 .env 为空,整个流水线仍可端到端运行。以下是你能获得的功能,以及各个密钥会带来的变化。
| 步骤 | 无密钥时 | 有密钥时 |
|---|---|---|
| 搜索 | GDELT DOC 2.0——官方、免费、无需注册,专注新闻——然后以 Bing/Google News RSS 作为备用 | Tavily / Brave / Serper / Google CSE:摘要更简洁,限额更高 |
| 文章提取 | 完整质量。trafilatura 在本地运行。 | — 不存在相应密钥 |
| 关键词 | 完整质量。从已获取的来源中挖掘关键词,并使用无需密钥的 Google 自动补全。 | — 付费关键词 API 可提供搜索量数据 |
| 人性化改写 | 返回规则集,并要求调用模型进行改写。在 Claude 中效果良好;在其他模型中的表现各不相同。 | 在服务端完成改写,效果一致 |
| 人工评分 | 本地启发式评分,标记为 is_real_detector: false | 真实检测器的评分 |
| 图片 | Pollinations 匿名服务:约每 15 秒 1 次请求,且可能带水印 | Cloudflare/OpenAI/Stability:干净、快速 |
| 架构、审计、文件 | 完整质量。 | — 不存在相应密钥 |
搜索:2026 年有哪些变化
Brave 不再是免费首选。 2026 年 2 月,Brave 移除了免费套餐,并改为所有套餐均按额度计费——需要绑定银行卡,每月 5 美元额度约可支持 1,000 次请求,超出后会继续收费。
目前仍然实用的免费选项,按优先级排序:
- 发布者信息源——无需密钥、无需注册、没有配额,且默认启用。服务会直接读取约 50 家科技、AI 和安全领域发布者自己的 RSS 信息源。这一点比听起来更重要:其他所有无需密钥的信息源返回的都是包裹着不透明标识符的
news.google.com重定向链接,因此可以统计故事数量,却无法打开文章。在一次无密钥的实时运行中,聚合器找到了 29 篇报道,但只有其中 1 篇的 URL 可供服务抓取。信息源中的<link>就是文章本身。限制在于覆盖范围而非访问权限:如果列出的媒体都没有报道某个故事,该信息源就无法发现它,此时其他信息源会作出响应。 - GDELT——无需密钥、无需注册,几乎没有限制。它是一个全球新闻索引,因此特别擅长回答“有没有人在报道这件事”,而这正是
verify_news要做的事。它免费且由多人共享,因此会进行速率限制;遇到这种情况时,服务会等待两分钟再继续,而不是针对同一次拒绝反复重试。 - Tavily——每月 1,000 个额度,每月续期,无需绑定银行卡。对于此流水线来说,这是最佳的密钥选项。设置
TAVILY_API_KEY。 - Google Custom Search——每天 100 次查询,无需绑定银行卡。需要从 programmablesearchengine.google.com 获取
GOOGLE_CSE_KEY和GOOGLE_CSE_ID。 - Serper——2,500 个额度,无需绑定银行卡,但额度仅可使用一次。适合评估,不适合持续运营博客。
- NewsAPI——免费套餐仅限非商业用途,且最新文章会延迟,这不适合追踪突发新闻。
免费套餐可能会变动;在决定使用之前,请先查看各个提供商自己的定价页面。
图片:实际所需内容
generate_image 无需密钥即可运行,但发布任何内容前请先阅读此说明。
Pollinations 仍允许匿名请求——大约每 15 秒一次,可使用基础模型——但免费匿名层可能会给图片加水印,导致图片无法作为已发布的横幅使用。以下是三种解决办法,按成本从低到高排列:
- 免费 Pollinations 令牌——在 auth.pollinations.ai 注册,无需银行卡。这样可以去除水印并提高速率限制。设置
POLLINATIONS_TOKEN。 改动最少,还能沿用现有提供方。 - Cloudflare Workers AI(推荐)——FLUX schnell、每日免费额度、无水印,而且是真正的生产级 API。设置
IMAGE_PROVIDER=cloudflare、CLOUDFLARE_ACCOUNT_ID和CLOUDFLARE_API_TOKEN。请注意,该模型返回 1024x1024 的图片,因此需要裁剪为横幅比例。 - OpenAI Images 或 Stability——按图片付费,质量最佳。
无论使用哪种方式,文件都会保存到本地。请上传文件,并将公开的 https
URL 传入 build_schema,否则 NewsArticle.image 指向的路径无法被任何爬虫访问。
如果只添加一个密钥
为图片添加 Cloudflare(或免费的 Pollinations 令牌)。搜索功能无需密钥即可正常运行;图片生成是唯一一个无密钥生成结果无法发布的环节。
诚实说明局限性
- 人工评分不能证明任何事情。 公开的 AI 检测器确实存在假阳性和假阴性,尤其是在短文本和非母语英语表达中。无密钥回退方案根本不是检测器——它衡量的是改写规则针对的结构性特征。请将其作为方向性信号呈现,并在读者看到分数的任何地方说明这一点。
- 商标过滤器是安全网,不是法律意见。 它会将已知品牌词改写为通用描述,并在提示词离开你的计算机前剔除标志请求。遇到新名称时,请扩展
src/newsblog_mcp/providers/imagegen.py中的TRADEMARKS,并检查生成结果。 - 新鲜度由你设定。
find_stories(days=1)表示当天;默认值为days=2。除非传入days,否则verify_news会搜索 14 天的时间范围。如果给它一个三周前的标题,它正确返回的也会是三周前的来源。 - GDELT 是索引,不是编辑。 它收录的出版商范围很广,其中也包括质量较低的出版商,因此两个 GDELT“出版商”意见一致,其证据力度弱于两家知名媒体意见一致。在信任
medium置信度之前,请查看sources中的域名。RSS 备用源是非官方端点,格式可能在不发出警告的情况下发生变化;某个源停止工作时,diagnose会告知你。 - SEO 和 AEO 工具只涵盖页面内内容。 包括关键词相关性、结构、元数据长度、替代文本、答案形式,以及双向链接。它们不会说明搜索量、竞争情况或其他网站指向你网站的链接——搜索量需要付费关键词 API,而来自其他网站的链接需要靠积累,无法生成。
- 内部链接需要已有内容库。 索引初始为空,会随着内容发布逐渐填充,因此第一篇文章不会收到任何建议。这是正常现象,不是故障。
- 生成的图片是本地文件。 请上传文件,并将公开的 https URL 传入
build_schema,否则NewsArticle.image指向的路径无法被任何爬虫访问。 - 交叉印证只负责计数,不负责判断。 服务会统计独立出版商的数量并标记日期冲突。至于这些出版商是否都在重复同一篇通讯社报道,仍需调用该服务的模型自行判断。
目录
src/newsblog_mcp/
server.py MCP entrypoint: 20 tools, 2 resources
diagnose.py standalone connectivity check
config.py env loading, capability report
paths.py decides where this install writes, and why
textutil.py tokenising, domains, sentence splitting, slugs
providers/
search.py Tavily, Brave, Serper, Google CSE, NewsAPI, GDELT, RSS
suggest.py keyless Google autocomplete, for long-tail and FAQ queries
llm.py Anthropic / OpenAI, used only by humanize_text
detector.py GPTZero / Sapling
imagegen.py OpenAI / Stability / Cloudflare / Pollinations + trademark filter
tools/ one module per MCP tool
links.py the post index and internal-link matcher
templates/ article.html.j2
resources/ house_style.md, humanizer_patterns.md
tests/smoke_test.py offline test suite
assets/ logo artwork, make_icon.py and the six app icons
output/ generated packages, in a source checkout only - see
"Where it keeps your files" for every other install
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。