Search US local-government meetings: AI summaries, transcripts, and adopted plan documents.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Discover the valid category and topic filter values before filtering a search. Meeting `category_tag`s are opaque UUIDs and topics have no fixed list, so you cannot guess them. Call this first to get the real values, then pass a returned `category_tag` (from `categories[].tags`) or `topic` string into `search_meetings_semantic` / `list_recent_meetings`. Scope with a government and/or date range; calls without explicit dates default to a recent window (returned as `default_window_days`).
Optional latest date, MM-DD-YYYY.
Optional earliest date, MM-DD-YYYY.
Max topics to return, most common first (1-200).
Optional account_id to scope the vocabulary to one government.
Optional list of account_ids to scope to several governments. Overrides government_id.
Discover the valid category and topic filter values before filtering a search. Meeting `category_tag`s are opaque UUIDs and topics have no fixed list, so you cannot guess them. Call this first to get the real values, then pass a returned `category_tag` (from `categories[].tags`) or `topic` string into `search_meetings_semantic` / `list_recent_meetings`. Scope with a government and/or date range; calls without explicit dates default to a recent window (returned as `default_window_days`).
| Argument | Type | Description |
|---|---|---|
| end_date | any | Optional latest date, MM-DD-YYYY. |
| start_date | any | Optional earliest date, MM-DD-YYYY. |
| topic_limit | integer | Max topics to return, most common first (1-200). |
| government_id | any | Optional account_id to scope the vocabulary to one government. |
| government_ids | any | Optional list of account_ids to scope to several governments. Overrides government_id. |
{
"type": "object",
"title": "discover_meeting_vocabularyArguments",
"properties": {
"end_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End Date",
"default": null,
"description": "Optional latest date, MM-DD-YYYY."
},
"start_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start Date",
"default": null,
"description": "Optional earliest date, MM-DD-YYYY."
},
"topic_limit": {
"type": "integer",
"title": "Topic Limit",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "Max topics to return, most common first (1-200)."
},
"government_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Government Id",
"default": null,
"description": "Optional account_id to scope the vocabulary to one government."
},
"government_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Government Ids",
"default": null,
"description": "Optional list of account_ids to scope to several governments. Overrides government_id."
}
}
}Resolve a place *name* to the governments OpenPublica tracks there. Use this when you know a city/state name but not its coordinates — it returns matching governments with their `account_id` (prefix matches first), which you then pass to the search/list tools. Prefer this over `find_local_governments` when starting from a name rather than a latitude/longitude.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max governments to return (1-50). |
| query* | string | A place name to search for, e.g. 'Sacramento', 'San Francisco, CA', or a state like 'Texas'. |
{
"type": "object",
"title": "find_governments_by_nameArguments",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Max governments to return (1-50)."
},
"query": {
"type": "string",
"title": "Query",
"description": "A place name to search for, e.g. 'Sacramento', 'San Francisco, CA', or a state like 'Texas'."
}
}
}Resolve a ZIP code to nearby tracked governments. Convenience wrapper: geocodes the ZIP, then finds the governments OpenPublica tracks nearest that point. Returns their `account_id`s plus the resolved location. An empty `governments` list means none are tracked near that ZIP yet.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max governments to return (1-50). |
| postal_code* | string | A US ZIP code, e.g. '95814'. |
{
"type": "object",
"title": "find_governments_by_zipArguments",
"required": [
"postal_code"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Max governments to return (1-50)."
},
"postal_code": {
"type": "string",
"title": "Postal Code",
"description": "A US ZIP code, e.g. '95814'."
}
}
}Discover which governments OpenPublica tracks near a coordinate. Returns nearby governments with their `account_id`, which you can pass to the other tools to scope results to a specific city or board. Note OpenPublica only covers a limited set of US localities; an empty result means none are tracked near that point yet.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max governments to return (1-50). |
| latitude* | number | Latitude of the location of interest. |
| longitude* | number | Longitude of the location of interest. |
{
"type": "object",
"title": "find_local_governmentsArguments",
"required": [
"longitude",
"latitude"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Max governments to return (1-50)."
},
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude of the location of interest."
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude of the location of interest."
}
}
}Get estimated stored-record totals, not publication-filtered coverage. Counts do not establish completeness, searchability or freshness. DC is reported separately from states as `includes_dc`.
No arguments.
{
"type": "object",
"title": "get_coverage_overviewArguments",
"properties": {}
}One document's metadata. Use read_document_pages to read it. If an `availability` key is present, read it before quoting figures: its `problems` are transcription-lint findings, most often a footnote marker that may have been merged into the number it annotates. No such key means the document transcribed cleanly.
| Argument | Type | Description |
|---|---|---|
| document_id* | string | Document id from list_government_documents or search_documents. |
{
"type": "object",
"title": "get_documentArguments",
"required": [
"document_id"
],
"properties": {
"document_id": {
"type": "string",
"title": "Document Id",
"description": "Document id from list_government_documents or search_documents."
}
}
}Get a tracked government's profile: name, location, and meeting categories.
| Argument | Type | Description |
|---|---|---|
| government_id* | string | The account_id of the government. |
| include_weekly_summary | boolean | If true, include the AI-generated weekly digest (markdown). Default false. |
{
"type": "object",
"title": "get_government_infoArguments",
"required": [
"government_id"
],
"properties": {
"government_id": {
"type": "string",
"title": "Government Id",
"description": "The account_id of the government."
},
"include_weekly_summary": {
"type": "boolean",
"title": "Include Weekly Summary",
"default": false,
"description": "If true, include the AI-generated weekly digest (markdown). Default false."
}
}
}Get meeting-activity stats for a government over a recent window. Returns total meeting count, a per-day activity map, and a breakdown of meeting categories — useful for "how active has X been lately?" questions.
| Argument | Type | Description |
|---|---|---|
| days | integer | Look-back window in days (1-365). |
| government_id* | string | account_id of the government, or 'all' for corpus-wide stats. |
{
"type": "object",
"title": "get_government_statsArguments",
"required": [
"government_id"
],
"properties": {
"days": {
"type": "integer",
"title": "Days",
"default": 30,
"maximum": 365,
"minimum": 1,
"description": "Look-back window in days (1-365)."
},
"government_id": {
"type": "string",
"title": "Government Id",
"description": "account_id of the government, or 'all' for corpus-wide stats."
}
}
}Get a single meeting's full AI summary and topics. Set `include_transcript=true` to also retrieve the complete transcript text for direct quotation. Returns an error object if the meeting is not found.
| Argument | Type | Description |
|---|---|---|
| meeting_id* | string | The meeting_id returned by a search/list tool. |
| include_transcript | boolean | If true, also fetch the full meeting transcript (can be long). Default false. |
{
"type": "object",
"title": "get_meetingArguments",
"required": [
"meeting_id"
],
"properties": {
"meeting_id": {
"type": "string",
"title": "Meeting Id",
"description": "The meeting_id returned by a search/list tool."
},
"include_transcript": {
"type": "boolean",
"title": "Include Transcript",
"default": false,
"description": "If true, also fetch the full meeting transcript (can be long). Default false."
}
}
}List a government's adopted plan and budget documents. Each entry carries `covers` — every general-plan element that document answers for. A city that publishes one bound general plan satisfies all eight with the same PDF, so do not conclude an element is unpublished because no entry is named after it. `status` says what the entry offers: `converted` is searchable and readable; `superseded` is a retired edition, still stored but not searchable; and **`failed` means we hold this document and could not read it — it is not evidence the city published nothing.** Cite `source_url` in that case; it is always the city's own copy. An `availability` block appears ONLY when something is wrong with a document, and `availability.reason` says what. No `availability` key means there is nothing to report.
| Argument | Type | Description |
|---|---|---|
| government_id* | string | account_id from find_local_governments. |
| include_superseded | boolean | Also include prior editions retired by a newer document. |
{
"type": "object",
"title": "list_government_documentsArguments",
"required": [
"government_id"
],
"properties": {
"government_id": {
"type": "string",
"title": "Government Id",
"description": "account_id from find_local_governments."
},
"include_superseded": {
"type": "boolean",
"title": "Include Superseded",
"default": false,
"description": "Also include prior editions retired by a newer document."
}
}
}Browse meetings newest-first, optionally filtered by government, type, topic, or date. Use this for "what are the most recent meetings" or to page through a government's history. For topical questions, prefer `search_meetings_semantic`.
| Argument | Type | Description |
|---|---|---|
| page | integer | 1-based page number for older results. |
| limit | integer | Meetings per page (1-25). |
| topic | any | Optional topic filter — a topic name from discover_meeting_vocabulary, e.g. 'Affordable Housing'. |
| end_date | any | Optional latest date, MM-DD-YYYY. |
| start_date | any | Optional earliest date, MM-DD-YYYY. |
| category_tag | any | Optional meeting-type filter — an opaque category_tag from discover_meeting_vocabulary (not a guessable slug; don't invent it). |
| government_id | any | account_id to list meetings for (from find_local_governments). Omit to list across all governments. |
{
"type": "object",
"title": "list_recent_meetingsArguments",
"properties": {
"page": {
"type": "integer",
"title": "Page",
"default": 1,
"minimum": 1,
"description": "1-based page number for older results."
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 25,
"minimum": 1,
"description": "Meetings per page (1-25)."
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Topic",
"default": null,
"description": "Optional topic filter — a topic name from discover_meeting_vocabulary, e.g. 'Affordable Housing'."
},
"end_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End Date",
"default": null,
"description": "Optional latest date, MM-DD-YYYY."
},
"start_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start Date",
"default": null,
"description": "Optional earliest date, MM-DD-YYYY."
},
"category_tag": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Category Tag",
"default": null,
"description": "Optional meeting-type filter — an opaque category_tag from discover_meeting_vocabulary (not a guessable slug; don't invent it)."
},
"government_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Government Id",
"default": null,
"description": "account_id to list meetings for (from find_local_governments). Omit to list across all governments."
}
}
}Read a page range of a document as markdown. Pages are transcribed from rendered pixels, so tables and scanned text come through as text. A page that could not be transcribed appears as a marked hole rather than being silently dropped — if you see one, say so instead of reading past it. Text is assembled from page windows, so `covered` may be slightly wider than what you asked for; cite the page numbers in `covered`, not `requested`.
| Argument | Type | Description |
|---|---|---|
| last_page* | integer | Last page to read. Spans longer than 40 pages are clamped to 40 from first_page. |
| first_page* | integer | First page to read (1-based, as the PDF renders). |
| document_id* | string | Document id from list_government_documents or search_documents. |
{
"type": "object",
"title": "read_document_pagesArguments",
"required": [
"document_id",
"first_page",
"last_page"
],
"properties": {
"last_page": {
"type": "integer",
"title": "Last Page",
"minimum": 1,
"description": "Last page to read. Spans longer than 40 pages are clamped to 40 from first_page."
},
"first_page": {
"type": "integer",
"title": "First Page",
"minimum": 1,
"description": "First page to read (1-based, as the PDF renders)."
},
"document_id": {
"type": "string",
"title": "Document Id",
"description": "Document id from list_government_documents or search_documents."
}
}
}Search adopted plan and budget documents, returning page-cited excerpts. Each hit's `text` is a short passage around the match, not the full page — call read_document_pages with the hit's `first_page` to read it in context. Every hit carries `first_page`/`last_page` and `source_url`. Quote those when citing: the page number is what makes the claim checkable against the city's own copy. This is word matching, not semantic search — try the terms a plan would actually use. Only currently-served documents are searchable, so an empty result is not evidence the government has no such policy; check list_government_documents for what is held and what could not be read. A hit with `document_complete: false` comes from a document with transcription findings. Verify it against `source_url` before quoting a number from it.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum excerpts to return. |
| query* | string | Words to find in plan and budget text, e.g. 'accessory dwelling unit parking'. |
| government_id | any | Optional account_id to restrict the search to one government. |
{
"type": "object",
"title": "search_documentsArguments",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum excerpts to return."
},
"query": {
"type": "string",
"title": "Query",
"description": "Words to find in plan and budget text, e.g. 'accessory dwelling unit parking'."
},
"government_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Government Id",
"default": null,
"description": "Optional account_id to restrict the search to one government."
}
}
}Search public meetings once across metadata and stored transcript text. Returns one card per meeting and native pagination metadata, without a total. Small current-text previews can be absent and do not establish timestamps. Text relevance can lag updates or match across untimed boundaries. Source transcripts searches stored text, including meetings without timed proof.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Analyzed words; put the whole query in double quotes for an analyzed phrase. |
| topic | any | |
| cursor | any | Native next_cursor or previous_cursor from the same query and filters. |
| source | string | |
| end_date | any | |
| start_date | any | |
| category_tag | any | |
| government_id | any |
Use unified stored-text search inside one currently public meeting. Returns an optional current-text preview, without resolving timing. A text match can lack a literal preview; use get_meeting(include_transcript=true) for full source retrieval. This does not run a separate local scan or fuzzy passage ranking.
| Argument | Type | Description |
|---|---|---|
| query* | string | Analyzed words or a whole quoted phrase. |
| meeting_id* | string | Canonical meeting_id returned by a search/list tool. |
{
"type": "object",
"title": "search_meeting_transcriptArguments",
"required": [
"meeting_id",
"query"
],
"properties": {
"query": {
"type": "string",
"title": "Query",
"maxLength": 160,
"minLength": 1,
"description": "Analyzed words or a whole quoted phrase."
},
"meeting_id": {
"type": "string",
"title": "Meeting Id",
"description": "Canonical meeting_id returned by a search/list tool."
}
}
}Find AI summaries by meaning; use search_meeting_content for stored words. Results carry relevance_score and a summary preview. Narrow with government, category_tag, topic or dates; get_meeting retrieves the full summary.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max meetings to return (1-25). |
| query* | string | What to search for in plain language, e.g. 'short-term rental regulations' or 'police budget overtime'. |
| topic | any | Optional topic filter — a topic name from discover_meeting_vocabulary, e.g. 'Affordable Housing'. Restricts to meetings that discussed it. |
| end_date | any | Optional latest meeting date, MM-DD-YYYY. |
| min_score | any | Optional semantic relevance floor 0-1 (default 0.4). Raise to return only strong matches; lower to widen recall. |
| match_type | string | Semantic only; use search_meeting_content for keyword searches. |
| start_date | any | Optional earliest meeting date, MM-DD-YYYY. |
| category_tag |
| government_ids | any |
{
"type": "object",
"title": "search_meeting_contentArguments",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 20,
"minimum": 1
},
"query": {
"type": "string",
"title": "Query",
"maxLength": 160,
"minLength": 1,
"description": "Analyzed words; put the whole query in double quotes for an analyzed phrase."
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Topic",
"default": null
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null,
"description": "Native next_cursor or previous_cursor from the same query and filters."
},
"source": {
"enum": [
"all",
"metadata",
"transcripts"
],
"type": "string",
"title": "Source",
"default": "all"
},
"end_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End Date",
"default": null
},
"start_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start Date",
"default": null
},
"category_tag": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Category Tag",
"default": null
},
"government_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Government Id",
"default": null
},
"government_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Government Ids",
"default": null
}
}
}| any |
| Optional meeting-type filter — an opaque category_tag from discover_meeting_vocabulary (not a guessable slug). |
| government_id | any | Optional account_id (from find_local_governments) to restrict the search to one government. |
| government_ids | any | Optional list of account_ids to search across several governments at once (e.g. to compare cities). Overrides government_id. |
{
"type": "object",
"title": "search_meetings_semanticArguments",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 25,
"minimum": 1,
"description": "Max meetings to return (1-25)."
},
"query": {
"type": "string",
"title": "Query",
"description": "What to search for in plain language, e.g. 'short-term rental regulations' or 'police budget overtime'."
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Topic",
"default": null,
"description": "Optional topic filter — a topic name from discover_meeting_vocabulary, e.g. 'Affordable Housing'. Restricts to meetings that discussed it."
},
"end_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End Date",
"default": null,
"description": "Optional latest meeting date, MM-DD-YYYY."
},
"min_score": {
"anyOf": [
{
"type": "number",
"maximum": 1,
"minimum": 0
},
{
"type": "null"
}
],
"title": "Min Score",
"default": null,
"description": "Optional semantic relevance floor 0-1 (default 0.4). Raise to return only strong matches; lower to widen recall."
},
"match_type": {
"type": "string",
"const": "semantic",
"title": "Match Type",
"default": "semantic",
"description": "Semantic only; use search_meeting_content for keyword searches."
},
"start_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start Date",
"default": null,
"description": "Optional earliest meeting date, MM-DD-YYYY."
},
"category_tag": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Category Tag",
"default": null,
"description": "Optional meeting-type filter — an opaque category_tag from discover_meeting_vocabulary (not a guessable slug)."
},
"government_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Government Id",
"default": null,
"description": "Optional account_id (from find_local_governments) to restrict the search to one government."
},
"government_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Government Ids",
"default": null,
"description": "Optional list of account_ids to search across several governments at once (e.g. to compare cities). Overrides government_id."
}
}
}