OpenPublica
REMOTE · API.OPENPUBLICA.COM · SCANNED SEP 24
Search US local-government meetings: AI summaries, transcripts, and adopted plan documents.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security57
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 15 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability82
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2913 tokens (~194/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
- Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (73% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
How do I install the OpenPublica MCP server?
OpenPublica is a hosted endpoint at https://api.openpublica.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.openpublica.com
claude mcp add --transport http com-openpublica-civic-meetings 'https://api.openpublica.com/mcp'
{
"mcpServers": {
"com-openpublica-civic-meetings": {
"url": "https://api.openpublica.com/mcp"
}
}
} {
"servers": {
"com-openpublica-civic-meetings": {
"type": "http",
"url": "https://api.openpublica.com/mcp"
}
}
} [mcp_servers.com-openpublica-civic-meetings] url = "https://api.openpublica.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-openpublica-civic-meetings": {
"type": "remote",
"url": "https://api.openpublica.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-openpublica-civic-meetings --url 'https://api.openpublica.com/mcp' --transport streamable-http
mcp_servers:
com-openpublica-civic-meetings:
url: "https://api.openpublica.com/mcp" {
"McpServers": {
"com-openpublica-civic-meetings": {
"Transport": "http",
"Url": "https://api.openpublica.com/mcp"
}
}
} assistant mcp add com-openpublica-civic-meetings -t streamable-http -u 'https://api.openpublica.com/mcp'
{
"mcpServers": {
"com-openpublica-civic-meetings": {
"type": "http",
"url": "https://api.openpublica.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 24 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 0
- A breaking change shipped without a version bump: still 1.0.0 ▼ security
- Tool “get_meeting_officials” was removed ▼ security
- Tool “get_official” was removed ▼ security
- Tool “list_government_officials” was removed ▼ security
- Tool “list_official_meetings” was removed ▼ security
- The server rewrote its instructions, which are the text every model session reads security
- Tool “get_meeting” rewrote its description, which is the text the model reads security
- Schema quality: 174 → 194 ▼ functional
- Tool coverage: 79% → 73% ▼ functional
- 14 Sept 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool coverage: 73% → 79% ▲ functional
- Schema quality: 194 → 174 ▲ functional
- New tool “get_meeting_officials” functional
- New tool “get_official” functional
- New tool “list_government_officials” functional
- New tool “list_official_meetings” functional
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 24 Sept 2026 · Probed https://api.openpublica.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=*.openpublica.com | CN=Amazon RSA 2048 M01,O=Amazon,C=US | 7 Feb 2026 | 8 Mar 2027 | RSA 2048 | SHA256-RSA | 3c7afeaddfad1f0ec7bc106d5404fee |
| SANs: *.openpublica.com | ||||||
| CN=Amazon RSA 2048 M01,O=Amazon,C=US (CA) | CN=Amazon Root CA 1,O=Amazon,C=US | 23 Aug 2022 | 23 Aug 2030 | RSA 2048 | SHA256-RSA | 77312380b9d6688a33b1ed9bf9ccda68e0e0f |
| CN=Amazon Root CA 1,O=Amazon,C=US (CA) | CN=Starfield Services Root Certificate Authority - G2,O=Starfield Technologies\, Inc.,L=Scottsdale,ST=Arizona,C=US | 25 May 2015 | 31 Dec 2037 | RSA 2048 | SHA256-RSA | 67f944a2a27cdf3fac2ae2b01f908eeb9c4c6 |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.openpublica.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| openpublica.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.openpublica.com/mcp | Verified | 200 | |
| http (plaintext) | http://api.openpublica.com/mcp | HTTPS enforced |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
discover_meeting_vocabulary Discover category and topic filters ~215
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`).
| Name | Type | Req | Description |
|---|---|---|---|
| end_date | – | – | Optional latest date, MM-DD-YYYY. |
| government_id | – | – | Optional account_id to scope the vocabulary to one government. |
| government_ids | – | – | Optional list of account_ids to scope to several governments. Overrides government_id. |
| start_date | – | – | Optional earliest date, MM-DD-YYYY. |
| topic_limit | integer | – | Max topics to return, most common first (1-200). |
Structured output declared, but exposes no named fields.
No examples provided.
find_governments_by_name Find governments by name ~143
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max governments to return (1-50). |
| query | string | yes | A place name to search for, e.g. 'Sacramento', 'San Francisco, CA', or a state like 'Texas'. |
Structured output declared, but exposes no named fields.
No examples provided.
find_governments_by_zip Find governments by ZIP code ~110
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max governments to return (1-50). |
| postal_code | string | yes | A US ZIP code, e.g. '95814'. |
Structured output declared, but exposes no named fields.
No examples provided.
find_local_governments Find governments near a location ~124
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.
| Name | Type | Req | Description |
|---|---|---|---|
| latitude | number | yes | Latitude of the location of interest. |
| limit | integer | – | Max governments to return (1-50). |
| longitude | number | yes | Longitude of the location of interest. |
Structured output declared, but exposes no named fields.
No examples provided.
get_coverage_overview Get coverage overview ~62
Get OpenPublica's overall coverage: total governments, states, and meetings indexed. DC is tracked but is not a state, so it is reported separately as `includes_dc` — read the pair as "N states and DC".
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
get_document Get document metadata ~102
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.
| Name | Type | Req | Description |
|---|---|---|---|
| document_id | string | yes | Document id from list_government_documents or search_documents. |
No output schema declared.
No examples provided.
get_government_info Get government profile ~62
Get a tracked government's profile: name, location, and meeting categories.
| Name | Type | Req | Description |
|---|---|---|---|
| government_id | string | yes | The account_id of the government. |
| include_weekly_summary | boolean | – | If true, include the AI-generated weekly digest (markdown). Default false. |
Structured output declared, but exposes no named fields.
No examples provided.
get_government_stats Get government meeting stats ~95
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.
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Look-back window in days (1-365). |
| government_id | string | yes | account_id of the government, or 'all' for corpus-wide stats. |
Structured output declared, but exposes no named fields.
No examples provided.
get_meeting Get meeting ~95
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.
| Name | Type | Req | Description |
|---|---|---|---|
| include_transcript | boolean | – | If true, also fetch the full meeting transcript (can be long). Default false. |
| meeting_id | string | yes | The meeting_id returned by a search/list tool. |
Structured output declared, but exposes no named fields.
No examples provided.
list_government_documents List government documents ~234
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.
| Name | Type | Req | Description |
|---|---|---|---|
| government_id | string | yes | account_id from find_local_governments. |
| include_superseded | boolean | – | Also include prior editions retired by a newer document. |
No output schema declared.
No examples provided.
list_recent_meetings List recent meetings ~204
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| category_tag | – | – | Optional meeting-type filter — an opaque category_tag from discover_meeting_vocabulary (not a guessable slug; don't invent it). |
| end_date | – | – | Optional latest date, MM-DD-YYYY. |
| government_id | – | – | account_id to list meetings for (from find_local_governments). Omit to list across all governments. |
| limit | integer | – | Meetings per page (1-25). |
| page | integer | – | 1-based page number for older results. |
| start_date | – | – | Optional earliest date, MM-DD-YYYY. |
| topic | – | – | Optional topic filter — a topic name from discover_meeting_vocabulary, e.g. 'Affordable Housing'. |
Structured output declared, but exposes no named fields.
No examples provided.
read_document_pages Read document pages ~180
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| document_id | string | yes | Document id from list_government_documents or search_documents. |
| first_page | integer | yes | First page to read (1-based, as the PDF renders). |
| last_page | integer | yes | Last page to read. Spans longer than 40 pages are clamped to 40 from first_page. |
No output schema declared.
No examples provided.
search_documents Search documents ~255
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.
| Name | Type | Req | Description |
|---|---|---|---|
| government_id | – | – | Optional account_id to restrict the search to one government. |
| limit | integer | – | Maximum excerpts to return. |
| query | string | yes | Words to find in plan and budget text, e.g. 'accessory dwelling unit parking'. |
No output schema declared.
No examples provided.
search_meeting_transcript Search meeting transcript ~199
Find exact quotes/passages inside one meeting's transcript. Use this to pull direct quotations without loading a whole (often very long) transcript: it fetches the transcript server-side, scans it, and returns only the matching passages with approximate `start`/`end` timecodes when available. Exact matches rank first, with a fuzzy fallback. Prefer this over `get_meeting(include_transcript=true)` when you only need specific quotes.
| Name | Type | Req | Description |
|---|---|---|---|
| context_chars | integer | – | Characters of surrounding context per side of a match (0-2000). |
| max_passages | integer | – | Max matched passages to return (1-20). |
| meeting_id | string | yes | The meeting_id (from a search/list tool) whose transcript to search. |
| query | string | yes | The phrase or terms to find in the transcript, e.g. 'rent stabilization' or a speaker's exact words. |
Structured output declared, but exposes no named fields.
No examples provided.
search_meetings_semantic Search meetings ~495
Search OpenPublica meeting summaries by meaning, exact terms, or both. The best default tool for "what has been said/decided about X" questions. Results carry a `relevance_score` (semantic, 0-1) and/or `keyword_score` (BM25) plus `highlights`, so you can triage matches by confidence. If the response sets `degraded_to_vector`, the keyword index was unavailable and results are semantic-only — do NOT treat them as exact-term matches. Narrow with `category_tag`/`topic` (get valid values from `discover_meeting_vocabulary`), a date range, or one or more governments. Returns a summary preview; call `get_meeting` with a returned `meeting_id` for the full summary or transcript.
| Name | Type | Req | Description |
|---|---|---|---|
| category_tag | – | – | Optional meeting-type filter — an opaque category_tag from discover_meeting_vocabulary (not a guessable slug). |
| end_date | – | – | Optional latest meeting date, MM-DD-YYYY. |
| government_id | – | – | Optional account_id (from find_local_governments) to restrict the search to one government. |
| government_ids | – | – | Optional list of account_ids to search across several governments at once (e.g. to compare cities). Overrides government_id. |
| limit | integer | – | Max meetings to return (1-25). |
| match_type | – | – | How to match: 'semantic' (default, by meaning — best for concepts/paraphrases), 'keyword' (exact terms — best for names, ordinance numbers, quoted phrases), or 'hybrid' (both, rank-fused). Use keywor… |
| min_score | – | – | Optional semantic relevance floor 0-1 (default 0.4). Raise to return only strong matches; lower to widen recall. Applies to semantic matching only — keyword (BM25) hits are not filtered by it. |
| query | string | yes | What to search for in plain language, e.g. 'short-term rental regulations' or 'police budget overtime'. |
| start_date | – | – | Optional earliest meeting date, MM-DD-YYYY. |
| topic | – | – | Optional topic filter — a topic name from discover_meeting_vocabulary, e.g. 'Affordable Housing'. Restricts to meetings that discussed it. |
Structured output declared, but exposes no named fields.
No examples provided.
What is the OpenPublica MCP server?
OpenPublica is an MCP server listed in the public MCP registry as com.openpublica/civic-meetings. Search US local-government meetings: AI summaries, transcripts, and adopted plan documents. This page covers its hosted endpoint (https://api.openpublica.com/mcp).
Is the OpenPublica MCP server safe to use?
OpenPublica scores 77 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the OpenPublica MCP server expose?
OpenPublica exposes 15 tools: search_meetings_semantic, list_recent_meetings, get_meeting, search_meeting_transcript, find_local_governments, and 10 more. Their descriptions and schemas cost roughly 2,575 tokens of context every time the server is loaded.
Does the OpenPublica MCP server require authentication?
No. We connected to OpenPublica without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the OpenPublica MCP server still maintained?
OpenPublica is still listed as active in the MCP registry. We last reached this channel on 24 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.