oravan
Oravan's server provides read-only, keyless access to U.S. federal legislative and representative data, with bilingual (EN/ES) support and citation envelopes on every response.
lookup_representatives: Find a constituent's U.S. House member and two Senators by 5-digit ZIP code — returns names, party, phone numbers, official websites, portrait URLs, and district office contact info. Handles split-ZIP situations and explicitly surfaces vacant seats.get_bill: Retrieve a full plain-language decode of any federal bill by slug (e.g.hr-2701-119) or citation (e.g.H.R. 2701). Includes summary, what/who/why/cost breakdown, official status, urgency band, sponsor, key dates, and links to Congress.gov.search_bills: Search the bilingual federal bill corpus using free-text queries, issue topic filters (e.g. health, immigration, housing), status filters, and an active-only flag. Results are returned most urgent first.whats_moving: Discover recently active bills that have cleared Oravan's "act now" urgency threshold within a configurable lookback window (default 7 days, up to 90), optionally filtered by topic. Honestly returns an empty list with aquiet_weekflag when nothing qualifies — never pads results.get_representative: Get comprehensive details on a specific member of Congress by Bioguide ID, including their 5 most recently active sponsored bills. Strictly factual — no scorecards or vote grades.
All tools require no API key and include a citation envelope detailing source, data freshness, AI-content label, and license.
Oravan
Your line to Congress · Tu línea con el Congreso
Oravan is free, nonpartisan civic infrastructure: find your federal representatives, understand active bills in plain language (English and Spanish), get a 30-second call script, and make the call — in under 5 minutes, with no account.
The name is the Oravan: the platform in the Roman Forum where citizens stood to address the public and the powerful — the original place a voice met power. Latin roots are the shared ancestry of English and Spanish alike.
MCP server
This repository also implements a remote MCP (Model Context Protocol) server — the same decoded corpus and lookups, exposed for AI assistants and agents:
Endpoint (Streamable HTTP):
https://oravan.org/api/mcp/mcp— keyless, read-only, rate-limited; no account or credentials requiredLocal/stdio:
npm cithennpx tsx scripts/mcp-stdio.mjs— the same 5 tools over stdio, zero env vars/secrets requiredImplementation:
app/api/mcp/[transport]/route.ts(built onmcp-handler+@modelcontextprotocol/sdk), tool definitions shared with the stdio entry vialib/core/mcp-tools.ts, pure data layer inlib/core/Five tools:
lookup_representatives,get_bill,search_bills,whats_moving,get_representative— every response carries a citation envelope (source, as-of freshness, AI-content label, license) in English or SpanishOfficial MCP Registry: published as
org.oravan/mcp(server.jsonat the repo root, schema-validated in CI byscripts/check-server-json.mjs)Docs: oravan.org/mcp (tool reference, client config, privacy posture) · docs/mcp-server-readme.md
Related MCP server: CongressMCP-full
Design principles
Zero accounts. ZIP code, interests, and call history live in
localStorageon the visitor's device. No server-side user data exists — nothing to breach, leak, or subpoena. This is the core privacy posture for at-risk users, not a missing feature.Static-first. Bills, legislators, district offices, and ZIP→district mappings are static JSON in
data/, baked into ~1,000 statically generated pages. Fast, nearly free to host, resilient under load. The only dynamic endpoints are/api/script(AI script generation, cached per bill+stance+language, IP rate-limited),/api/reps(pure lookup),/api/district(stateless split-ZIP address refinement: proxies the Census geocoder so the visitor's IP never reaches census.gov; the address is never stored or logged), and/api/feedback(beta feedback relayed to a private GitHub issue — only what the visitor volunteered, no identifiers).Bilingual as a first-class feature. Full EN/ES UI via
next-intl; scripts are generated in the user's language.Truth first; the call is the natural next step. Oravan leads as an unbiased, plain-words account of what Congress is actually doing — understanding is the front door, never an assignment. The call apparatus stays the differentiator (voicemail legitimized, offices tally it identically; after-hours calling encouraged; district offices listed alongside DC; outcomes — spoke / voicemail / couldn't reach — logged locally on the device), and every decoded answer keeps a completed call script within two interactions. Demoted, never buried. (Amended 2026-07-26; previously "The call moment is the product." Enforced by the three named invariants in
tests/funnel.spec.ts— see DESIGN.md structural constraint 2.)Honest about AI. Every generated summary and script is labeled at first contact, and nothing publishes unless the automated gates pass: both languages present, the official record attached, and a schema check on every decode — a decode that comes back missing a required field is discarded rather than stored half-written, and
scripts/verify-sync.mjsre-checks the whole corpus and fails the nightly run before it is allowed to commit anything. (Amended 2026-08-12: one check left that file and now runs AFTER the commit — the cursor-age ceiling inscripts/check-cursor-age.mjs. It is a progress signal, not a corpus one: a stalled cursor means we are behind, and failing it before the commit made a stalled night throw away a night of already-paid decodes. Every corpus check named here is unchanged and still runs before anything is committed. See CLAUDE.md's amendment of the same date.) Nonpartisan wording is a drafting instruction to the model on bill decodes and an enforced vocabulary lint on Big Questions (lib/moments-gate.mjs) — the two are not the same guarantee, and the copy never blurs them. The nightly decode path has no human step and the product never claims one; the one review it does claim is real: a caller reads, and can edit, the call script before dialing. (Amended 2026-08-06; previously "labeled, editable, and reviewed by the human before any call." See CLAUDE.md's 2026-07-25 amendment, which this line should have followed and did not.)Accessible by default. Semantic landmarks, skip link, visible focus,
prefers-reduced-motion, 44px+ touch targets, AA contrast.
Data sources
File | Source | Refresh |
| Decoded bill corpus (Congress.gov bills + AI plain-language summaries, English and Spanish) | Nightly sync ( |
| unitedstates/congress-legislators (public domain) + district offices |
|
| same | |
| Derived, not fetched: |
|
| Human-authored ( |
|
| Civilian Senate nominations (PNs) of the 119th Congress — Congress.gov's own citation, description sentence, and latest action, plus a status derived from that action text by |
|
| Real news articles about top-band bills via TheNewsAPI, AI-relevance-filtered (Haiku) |
|
| Outlet political-lean ratings by AllSides, used under CC BY-NC with attribution | Vendored snapshot |
Portraits are served from the public-domain unitedstates/images project.
Solved pipeline incidents (root cause + the CI gates that prevent recurrence) are documented in docs/solutions/.
The "Read" section (outlet-bias coverage)
Each top bill's page shows real third-party articles about it, labeled by the outlet's political lean (Left / Center / Right) — reusing AllSides' publication-level ratings, never a Oravan-invented one. Oravan takes no stance and authors no partisan text: AI is used only behind the scenes — generating each bill's news-search terms (press-style names and a subject query) and a cheap relevance gate (is this article about this bill?) — and authors nothing displayed. The ingestion runs nightly in CI and bakes results to JSON, so the site still makes zero runtime third-party calls. Without NEWS_API_KEY the sync is a no-op and the section renders nothing; a small hand-built real sample (data/coverage.json) keeps it demoable. Lean is shown by text label + position only — never party colors (a hard rule; see DESIGN.md).
Develop
npm install
echo "ANTHROPIC_API_KEY=sk-ant-..." > .env.local # script generation + decode/relevance
echo "NEWS_API_KEY=..." >> .env.local # optional; enables the "Read" coverage sync
npm run devnpm run build statically generates every bill page in both locales.
Known v1 caveats
ZIP→district mapping is ZCTA-based; a split ZIP shows all candidate districts by default (senators are unaffected). Entering a street address — optional, sent once by POST, never stored or logged — narrows it to the actual district via a server-proxied Census-geocoder lookup; the all-candidates view remains the graceful fallback whenever the geocoder can't help. The geocoder request pins the "119th Congressional Districts" layer, which needs a bump when the Census rolls the vintage to the 120th.
Script cache and rate limits are in-memory per serverless instance — fine at demo scale, should move to a shared store before heavy traffic.
New bills can lag behind Congress.gov: the nightly sync decodes at most
MAX_NEW_DECODESnew bills per run (cost ceiling), so after a missed window the corpus catches up over several nights (decode-before-publish; the backlog drains oldest-first)."Read" coverage exists only for top-band bills (the long tail shows nothing); the ES locale shows the same English articles with localized chrome; outlets absent from
data/media-bias.jsonappear without a lean chip.
License
Code: GNU AGPL-3.0. You may use, modify, and run this code — including as a network service — provided modified versions you operate or distribute remain open under the same license. Embedding Oravan's hosted widgets on your site via the loader/script tag does not subject your site to the AGPL; that's use of our service, not distribution of this code.
Not licensed: the Oravan name, logo, and brand assets (
assets/brand/, app icons). All rights reserved — forks must use their own identity.Content: underlying legislative data is U.S. government work (public domain). AI-generated decodes and summaries are licensed CC BY 4.0, exactly as declared in the MCP citation envelope and on the citations page.
Maintenance
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAn MCP server for the Congress.gov API that consolidates 91 operations into 6 comprehensive legislative tools that can be used by any MCP client (i.e. Claude Desktop), or MCP-compatible AI agent, to query and reason about congressional data.141JavaScriptMIT
- AlicenseBqualityAmaintenanceThe open Congress.gov MCP server. Provides comprehensive access to the Congress.gov API through 6 organized toolsets, enabling AI systems to retrieve and interact with legislative data from the United States Congress with a clean, unified interface.2432Sustainable Use v1.0
- AlicenseNot gradedqualityDmaintenanceEnables querying U.S. legislative data from Congress.gov API using MCP resources for direct lookups and tools for searching and retrieving related data.8MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying legislative data from the LegiScan API, including bills and votes, via natural language through an MCP gateway.10MIT
Related MCP Connectors
GovTrack MCP — federal US Congress data (free, no auth)
Congress MCP — US Congress data via GovTrack API (free, no auth required)
LegiScan MCP — wraps the LegiScan API (api.legiscan.com)
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/cm2489/oravan'
If you have feedback or need assistance with the MCP directory API, please join our Discord server