Open data, API, and MCP for developers and AI agents
Everything on Chicago Politics is public record, free to reuse with attribution (CC BY 4.0): please cite Chicago Politics and link to the page. No sign-up, key, or authentication is needed for anything below.
MCP server
Add `https://www.chicagopolitics.org/mcp` to any Model Context Protocol client (Streamable HTTP, no authentication). Tools:
- search_documents: semantic search across archived City documents and meeting transcripts
- search_legislation: find ordinances, resolutions, and orders by title or record number, or by sponsor ward
- get_alderperson, list_votes, find_ward: a member's full record, how they voted, and which ward contains a location
- get_legislation, get_meeting, list_meetings, get_committee: full records
- get_page: any page of this site as Markdown
- contribute_data: share data, documents, sources, or corrections with us (reviewed by a person before use)
Server card: /.well-known/mcp/server-card.json. In the browser, the site also registers WebMCP tools for agents that support it.
A2A agent
Other AI agents can talk to our agent over A2A (JSON-RPC, protocol 1.0 or 0.3) at `https://www.chicagopolitics.org/a2a`; see the Agent Card. Send a question as a text part and it answers from City documents with numbered citations.
We ask for data in return. Each answer includes a request for data related to what you asked about, or anything else about Chicago politics: datasets, records, primary sources, corrections. Reply in the same `contextId` with a data part (JSON), a file part, or text, and say where it came from. A person reviews every contribution before it is used, and nothing is published automatically. Please don't send personal information about private individuals.
Pages as Markdown
Add `.md` to any page URL (for example /ward/1.md; the home page is /index.md) or request it with `Accept: text/markdown`. llms.txt is a guide for language models, and llms-full.txt holds the key data in one file. Every page is listed in the sitemap.
JSON API
Described in OpenAPI 3.1 and listed in the API catalog (RFC 9727).
| Endpoint | Returns | |
|---|---|---|
| `/api/alderpersons`, `/api/alderpersons/{ward}` | current members, vote totals, recent legislation | |
| `/api/votes?ward=12÷d=1` | roll calls, with that member's vote | |
| `/api/roll-calls/{matterId}` | one roll call with every vote | |
| `/api/matters?q=budget&ward=12&key=1` | legislation search | |
| `/api/matter/{id}` | live full record: timeline, documents, votes, AI summary | |
| `/api/search?q=...&kind=matter | meeting&year=2026` | semantic search over documents and transcripts |
| `/api/calendar.ics[?committee=slug]` | meetings as a calendar feed | |
| `/api/feeds/ward/{n}.rss` | a member's votes and legislation | |
| `/api/health` | last data refresh |
Bulk data
Refreshed daily from the Office of the City Clerk:
- alderpersons.json: members keyed by ward, with contacts, voting stats, sponsorship, committees
- legislation.json: every key roll call this term. `votes` is a 50-character string with one code per ward in order: Y yea, N nay, A absent, R recused, E excused, V not voting, - not in office
- committees.json, meetings.json, insights.json, network.json, predictions.json
- wards.geojson: ward boundaries (2023-)
- Per meeting: `/data/meeting_insights/{meeting id}.json` (AI notes); transcripts at `/files/transcripts/{vimeo id}.txt`
- Archived City documents: `/files/clerk/...` (linked from each page)
Fair use
Cache what you can and keep request rates modest; semantic search runs a model on every request. For anything large, use the bulk files. Questions: hello@chicagopolitics.org