mcpField
S
Sidewise

Sidewise

远程服务
github.com/nulljosh其他01 周前更新
代码仓库

关于 Sidewise

Sidewise 汇集不同政治倾向的新闻来源,提供新闻聚合、报道比较和单侧报道盲点标记。读者和 Agent 可通过网页、API、终端客户端及无认证 MCP 服务访问。

主要功能

  1. 01聚合并按政治倾向标记新闻来源
  2. 02按标题聚类新闻并标记单侧报道
  3. 03并列比较不同来源的报道标题
  4. 04查看订阅源健康状态和数据完整性

适用场景

  1. 01查看不同政治倾向来源的最新新闻
  2. 02发现只有一侧报道的故事
  3. 03比较同一事件的各方标题与措辞
  4. 04检查新闻源故障或陈旧数据

MCP 相关

通过无状态 Streamable HTTP MCP 服务提供新闻检索、盲点查询、报道比较和订阅源健康检查工具。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://news.heyitsmejosh.com/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

README 配图

Sidewise

version license GitHub

另一边在读什么?

Sidewise 从不同立场的 14 家新闻编辑部获取 16 个信息源,为每个信息源标注左派、中间或右派立场, 并标出盲点:只有一边报道的新闻。免费。无需账户、密钥,也没有使用限制。

同一家新闻编辑部的两个信息源算作一个声音。出版商不能在主信息源旁边再设一个观点栏目,就称它们是两个来源。

五种使用方式:网页阅读器、原生的 iPhone、iPad 和 Mac 应用、JSON API、MCP 服务和终端客户端(swift build && ./.build/debug/sidewise-tui 5 — 参见 tui/)。

README 配图

截图

Sidewise

应用

基于 SwiftUI,在 ios/ 中为 iOS 和 macOS 提供同一套代码。它读取同一个公共 API。无需账户, 不追踪用户。已保存的新闻、关注列表、阅读记录和信息源缓存都保留在设备上。

iPhone 和 iPad 应用除了列出新闻,还能:

  • 比较。 打开一条新闻,各媒体的标题会按左到右并排显示,同时附上立场评级和外链。“比较”标签页仅列出两家或更多媒体都报道的新闻。只有一家媒体报道的新闻会明确标注,而不会伪装成比较结果。 信息源的聚类有时会纳入无关条目,因此只有与新闻标题至少共享两个有意义词语的标题才会保留在比较中。
  • 媒体与关注。 查看每家媒体的立场评级和近期标题。关注或静音任意媒体;静音的媒体会隐藏,关注的媒体则会显示在专属标签页中。
  • 我的阅读习惯。 查看本周实际打开内容中左派、中间和右派的占比、平均立场倾向,以及打开次数最多的媒体。
  • 分享扩展。 从 Safari 分享链接,它会按域名匹配并告知 Sidewise 对该媒体的评级;如果该媒体没有评级,也会明确说明。
  • 小组件。 主屏幕上的小号和中号小组件,显示头条新闻及其立场条。
cd ios && xcodegen generate
xcodebuild -scheme Sidewise-iOS -destination 'generic/platform=iOS Simulator' build

MCP

claude mcp add --transport http sidewise https://sidewise.jaybulb.com/mcp
工具参数返回内容
get_newsview、outlet、bias、developing、q、limit当前头条,可按新闻平铺显示或按新闻聚类显示
get_blindspotslimit仅显示由单一政治阵营报道的新闻
compare_coverageq(必填)、limit同一条新闻在各阵营的标题,以及各方独有的词语
get_feed_health:哪些信息源正常响应,以及提供的数据是完整数据还是过时的备用数据

在相信空结果或单边结果之前,先调用 get_feed_health。否则,服务中断和新闻平淡的一天看起来完全一样。

无状态、可流式传输的 HTTP,无需身份验证。兼容任何 MCP 客户端:Claude Desktop、Claude Code、Cursor。

API

GET https://sidewise.jaybulb.com/api/stories。所有参数均为可选。

参数值默认值
viewlatest、stories、bothboth
outlet任意媒体名称,例如 Hacker News全部
biasleft、center、right全部
blindspottrue关闭
developingtrue:过去 90 分钟内有三家或更多新闻编辑室报道关闭
comparetrue:为每条报道附上并排对比分析关闭
q匹配标题和摘要文本中的子字符串无
limit1–20060 个聚类 / 120 条标题

还有两个端点。GET /api/health 会报告每个信息源的状态;超过一半不可用时会返回 503,可直接将监控器指向该端点。GET /api/sources 会列出每个信息源及其倾向、所属阵营和上级新闻编辑室。

curl 'https://sidewise.jaybulb.com/api/stories?view=stories&blindspot=true'
curl 'https://sidewise.jaybulb.com/api/stories?view=latest&outlet=Hacker%20News&limit=10'
{
  "updated": 1754700000000,
  "stories": [
    {
      "title": "Fed holds rates steady",
      "blindspot": false,
      "sources": [
        { "title": "Fed holds rates steady", "link": "https://…", "outlet": "NPR", "bias": -1 },
        { "title": "Fed refuses to cut rates", "link": "https://…", "outlet": "Fox News", "bias": 2 }
      ]
    }
  ],
  "latest": [
    { "title": "Fed holds rates steady", "link": "https://…", "outlet": "NPR", "bias": -1, "ts": 1754699000000 }
  ]
}

CORS 已开放。信息源最多每 2 分钟重新拉取一次。响应采用 no-store(见下文)。ts 是纪元毫秒数;如果信息源未提供日期,则为 0。这类条目会排在末尾。完整规范:openapi.yaml · 面向 Agent 的使用指南:llms.txt。

工作原理

一个 Cloudflare Worker(worker.js)会轮询 src/feeds.js 中的所有信息源,并通过一次共享拉取提供页面、API 和 MCP:

  • latest:所有标题,按时间从新到旧排列。
  • stories:按标题关键词重合度对标题进行聚类。每个来源都标记为左倾、中间或右倾。仅由单一阵营报道的聚类会标记为 blindspot。

只有信息源拉取结果会使用一个固定键进行缓存。在 shape() 中,每次请求都会单独进行筛选;筛选完成后,响应采用 no-store。该区域的 CDN 缓存会忽略查询字符串,因此若缓存这些结果,一个调用方的 ?outlet= 参数就会影响所有人。无论如何都不会重新拉取信息源,只会再次执行开销很小的筛选。

聚类会在筛选之后进行。扁平信息流则会在 120 条上限之前筛选。两种顺序都很重要。先缩小输入范围,就会丢失跨媒体的对比结果。在上限之后再筛选,则会导致小型媒体消失。

架构

倾向评分

每个来源的评分从 -2(左倾)到 +2(右倾)。0 表示中间立场;对于 Hacker News 和 Daring Fireball 这类科技媒体,则表示无政治倾向。这些评分由我手动填写在 FEEDS 中,仅表示大致倾向,并非评级。

CBC · The Guardian · NPR · BBC · Global News · National Post · Fox News · NY Post · Daily Wire · Hacker News · Daring Fireball · NBC News · Wall Street Journal · NY Post Opinion · Vancouver Sun · The Province

如需添加来源,可在 worker.js 顶部的 FEEDS 中追加 [outlet, bias, url]。任何 RSS 2.0 或 Atom 信息源都可使用。

开发

npm test         # 95 checks, no network
npm run feeds    # check every feed for freshness, not just a 200
npm run deploy   # wrangler deploy

修改 FEEDS 后运行 npm run feeds。该命令会检查时效性,这是发现僵尸信息源的唯一方法:信息源仍会返回 200 和格式正确的 XML,但最新条目却是两年前的。CNN 曾连续三年如此,条目数量检查始终没能发现问题。

基于 Cloudflare Workers 和 Static Assets。一次部署即可提供页面、/api/stories 和 /mcp。

测试

test/ 在不联网且不使用 Worker 运行时的情况下,覆盖 src/ 中的四个模块:

文件覆盖内容
parse.test.mjs实体解码、双重转义摘要、CDATA 和 Atom 格式,以及拒绝 javascript: 和 data: 链接
stories.test.mjs聚类、盲点判定所依据的新闻编辑室而非信息源计数规则、发展中报道时间窗口,以及先聚类后筛选的顺序
load.test.mjs信息源故障报告、超时、降级/过期回退,以及错误的拉取结果绝不会覆盖上一次成功结果的规则
worker.test.mjs查询参数解析与限幅,以及 /api/ 下所有请求都会返回带 CORS 的 JSON,包括 404、405 和 500 响应
mcp.test.mjsJSON-RPC 帧格式、格式错误的输入,以及每个工具的契约

安全信息:请参阅 SECURITY.md。

许可证

MIT 2026,Joshua Trommel。标题和链接归其出版方所有。Sidewise 不存储任何内容,只链接到原始来源。

白皮书

技术白皮书

API 和 Agent 工具

REST(/api/*)、POST /mcp 服务以及阅读器页面内的 WebMCP 工具 (public/webmcp.js)提供相同的四项操作。它们经过相互测试,确保行为一致。请参阅 docs/API.md。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。