Oravan 是一个免费、无党派、双语(英语/西班牙语)的美国国会数据工具,目标是让普通用户快速了解国会动态并联系自己的议员。其核心流程是在5分钟内完成:查找联邦代表、用通俗语言理解活跃议案、获得30秒通话脚本,然后致电。整个过程无需账户。
主要能力:
- 议员查找:通过 ZIP 码定位联邦众议员和参议员,提供每位议员的专属页面。
- 议案理解:对活跃议案提供通俗语言摘要(英语和西班牙语),并附官方记录引用。
- 通话支持:生成30秒电话脚本,脚本按议案、立场、语言和内容版本缓存;支持下班后致电,电话结果(已通话/语音信箱/未能接通)记录在本地设备。
- “Read”板块:为重要议案展示真实第三方文章,并按媒体政治倾向(左/中/右)标注,倾向评级复用 AllSides 的媒体级评分。
- MCP 服务器:以远程 MCP(Streamable HTTP)和本地 stdio 两种方式暴露5个工具:lookup_representatives、get_bill、search_bills、whats_moving、get_representative。每个响应携带引用信封(来源、时效、AI 内容标签、许可证),支持英语或西班牙语。
使用方式:
- 网站访问:通过 oravan.org 使用,无需账户。
- MCP 远程端点:https://oravan.org/api/mcp/mcp,无密钥、只读、限速,无需账户或凭证。
- MCP 本地/stdio:先运行 npm ci,再运行 npx tsx scripts/mcp-stdio.mjs,提供相同的5个工具,无需环境变量或密钥。
- 实现位置:app/api/mcp/[transport]/route.ts,基于 mcp-handler + @modelcontextprotocol/sdk,工具定义通过 lib/core/mcp-tools.ts 与 stdio 入口共享,纯数据层在 lib/core/。
- MCP Registry:已以 org.oravan/mcp 发布,仓库根目录有 server.json,CI 中由 scripts/check-server-json.mjs 校验。
- 文档:oravan.org/mcp 和 docs/mcp-server-readme.md。
设计原则:
- 零账户:ZIP码、兴趣和通话历史只存在访客设备的 localStorage 中,服务器端无用户数据。
- 静态优先:议案、议员、地区办公室和 ZIP→选区映射都是 data/ 下的静态 JSON,构建时生成约7500个静态页面(2026-09-24 构建为7,566页,包括每位国会议员的页面和每日简报)。服务器端点包括 /api/script(AI 通话脚本生成,按议案+立场+语言+内容版本缓存,IP 限速)、/api/reps(纯查询)、/api/district(无状态拆分 ZIP 地址细化,代理 Census 地理编码器,访客 IP 不会到达 census.gov,地址不存储不记录)、/api/mcp(MCP 服务器)、/api/brand、/api/stripe/webhook、/api/tenant/impressions、/embed/portrait/[bioguide]。
- 双语优先:通过 next-intl 实现完整英西 UI,脚本按用户语言生成。
- 真相优先:以无偏见、通俗的语言呈现国会实际动态,理解是入口,而非任务分配。
- AI 透明:每个生成的摘要和脚本在首次接触时标注,发布前通过自动关卡(双语齐全、附官方记录、每个解码通过 schema 校验),脚本在拨号前由来电者阅读并可编辑。
- 无障碍默认:语义化地标、跳过链接、可见焦点、prefers-reduced-motion、44px+ 触控目标、AA 对比度。
- 议员肖像来自公有领域的 unitedstates/images 项目。
适用场景:
- 希望快速了解美国国会活跃议案并联系议员的普通公民。
- 需要双语(英语/西班牙语)国会信息的用户。
- 对隐私敏感、不愿创建账户的用户。
- AI 助手/智能体开发者,可通过 MCP 接入国会数据查询工具。
限制与已知问题:
- ZIP→选区映射基于 ZCTA,拆分 ZIP 默认显示所有候选选区(参议员不受影响);可输入街道地址(可选,POST 发送一次,不存储不记录)通过服务器代理的 Census 地理编码器缩小到实际选区。
- 地理编码请求固定“119th Congressional Districts”图层,Census 更新到120届时需升级。
- 脚本缓存和限速在共享 Upstash 存储中;未配置或请求失败时回退到每实例内存。
- 新议案可能滞后于 Congress.gov:每晚同步最多解码 MAX_NEW_DECODES 个新议案(成本上限),积压按最旧优先消化。
- “Read”覆盖仅限头部议案,长尾不显示;西班牙语界面显示相同的英文文章,仅界面本地化;不在 data/media-bias.json 中的媒体不显示倾向标签。
许可:
- 代码:GNU AGPL-3.0,可自由使用、修改和运行(包括作为网络服务),但运营或分发的修改版本必须保持相同许可证开源。通过加载器/脚本标签嵌入 Oravan 托管组件不使你的网站受 AGPL 约束。
- 品牌:Oravan 名称、Logo 和品牌资产(assets/brand/、应用图标)未授权,保留所有权利,分叉须使用自己的身份。
- 内容:底层立法数据为美国政府作品(公有领域)。AI 生成的解码和摘要按 CC BY 4.0 许可,与 MCP 引用信封和引用页面声明一致。