✓ Published on the MCP Registry✓ Works with ChatGPT Actions

Give your AI assistant access to local government data

Townbrief's MCP server puts 97 research tools at your AI's fingertips — every town meeting transcript, every municipal bylaw, every vote, every ethics case, every school district report — across 5,685+ cities and towns in 15 states.

Instead of you searching, reading, and summarizing — your AI does it. Ask a question in natural language, and your assistant calls the right tools, pulls the primary-source data, and gives you a cited answer.

What is this?

MCP = your AI can use tools, not just text

The Model Context Protocol(MCP) is an open standard that lets AI assistants like Claude and ChatGPT call external tools — search databases, pull documents, run queries — instead of relying only on their training data.

When you connect Townbrief's MCP server to your AI, it gains the ability to search our full corpus in real time: meeting transcripts, government documents, bylaws, vote records, financial filings, school data, ethics cases, and more. Your AI picks the right tool for your question, calls it, reads the results, and gives you a sourced answer.

Think of it like giving your AI a library card to the most comprehensive collection of local government data that exists.

What people use it for

🏛️

Town Meeting prep

Ask your AI: 'What did the Finance Committee say about the override last month?' and get a sourced answer with the transcript excerpt, vote tally, and related documents.

🏠

Real estate research

'What zoning changes are pending for parcels on Route 20 in Wayland?' — your AI searches Planning Board transcripts, bylaws, and documents in one query.

⚖️

Legal & ethics due diligence

Pull every Open Meeting Law violation, ethics complaint, and court case for a municipality — cross-referenced and cited.

📊

Cross-town comparison

'Compare tax rates, school spending, and free cash across Wayland, Sudbury, and Lincoln' — structured data, not web scraping.

📰

Newsroom automation

Wire your editorial tools into Townbrief to monitor new meetings, flag split votes, and draft story leads from fresh transcripts.

🎓

Academic research

Analyze local governance patterns across 5,685+ municipalities: voting behavior, budget trends, participation rates — all queryable.

How to connect

Four ways to use Townbrief's data

Easiest

Option 1: Ask Townbrief (no setup needed)

Go to chat.townbrief.com and start asking questions. The AI is already connected to all 97 tools. No API key, no configuration. Free accounts get 25 queries.

Open Ask Townbrief →
Recommended

Option 2: Claude Desktop (or any MCP client)

If you use Claude Desktop, Claude Code, Cursor, Windsurf, or any app that supports MCP servers, you can add Townbrief directly. Your AI will have all 97 tools available in every conversation.

  1. Get an API keysign up and copy your key from the dashboard.
  2. Open your MCP config — in Claude Desktop: Settings → Developer → Edit Config. In Cursor/Windsurf: your project's .cursor/mcp.json or equivalent.
  3. Add this server entry:
{ "mcpServers": { "townbrief": { "url": "https://api.townbrief.com/mcp/", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }
  1. Restart your app — the server appears in your tool list. Start asking questions.
ChatGPT

Option 3: ChatGPT Custom GPT

Build a Custom GPT in ChatGPT that can query all 97 Townbrief tools via Actions. Users authenticate with their Townbrief email the first time they use it.

  1. Create a Custom GPT — go to chat.openai.com/gpts/editor and start a new GPT.
  2. Add Actions — in Configure → Actions → Create new action, click “Import from URL” and enter:
https://api.townbrief.com/actions/openapi.json
  1. Set up authentication — under the Action's Authentication settings:
TypeOAuth
Authorization URLhttps://api.townbrief.com/authorize
Token URLhttps://api.townbrief.com/token
Scopemcp

For the Client ID and Client Secret, contact us— we'll provision OAuth credentials for your GPT.

  1. Add instructions — paste this into the GPT's Instructions field:
You are Townbrief, a local government intelligence assistant. You have access to structured data from a journalism pipeline covering 5,685+ municipalities across 15 states. When a user asks about a town, use list_recent_meetings or search_meetings with that town's slug (e.g. "wayland"). Use get_article for the AI-generated summary, get_transcript for the raw meeting record, search_transcripts for keyword search, and search_bylaws / get_bylaw_chapter for bylaws. For counties, use list_county_meetings or search_county_meetings. For daily news, use get_roundup. For events, get_town_calendar. Always cite the town, committee name, and meeting date.
  1. Save and test — ask “What happened at the last Select Board meeting in Wayland?” The first time, it redirects to a Townbrief consent page.
Developers

Option 4: REST API (any HTTP client)

Every MCP tool is also available as a REST endpoint. Build Townbrief data into your own app, newsroom workflow, or research pipeline.

# Search all meeting transcripts for “PFAS” in Wayland curl "https://api.townbrief.com/api/search_transcripts?town=wayland&query=PFAS" \ -H "Authorization: Bearer YOUR_API_KEY" # OpenAPI spec (for ChatGPT Custom GPTs) https://api.townbrief.com/actions/openapi.json

Pricing

Pay for what you use

Every account starts with free credits. When you run out, buy more — no subscription required, no expiration.

Free
$0
25 tool calls included
  • Ask Townbrief chat
  • MCP server access
  • All 5,685+ towns
  • All tool categories
Most popular
Pro
Metered
Pay per 10 tool calls
  • Full archive (2025–present)
  • Transcripts + SRT files
  • Unlimited towns
  • Priority support
Out of credits?
Top up
Instant, no expiration

When your free or paid credits run out, you'll see a prompt to purchase more. Credits are added instantly via Stripe — no subscription, cancel-anytime, and they never expire. Buy as few or as many as you need.

Ran out of credits on Ask Townbrief?You'll see a “credits exhausted” message with a link to top up. Purchase more credits from your account dashboard, and you're back to asking questions immediately. No waiting period.

Full tool catalog

97 tools, 14 categories

Meetings & Transcripts (10)

list_recent_meetings()
Newest meetings across all committees for a town.
search_meetings()
Full-text search over article text, filter by committee/date.
search_transcripts()
Full-text search over raw Whisper transcripts — use for verbatim quotes the AI article omitted.
get_article()
Full AP-style article, brief, deep-read, headlines for a meeting.
get_transcript()
Whisper transcript (txt or srt) for a meeting.
get_committee_summary()
Rolled-up briefs across a committee over a date range.
get_meeting_bundle()
Every artifact tied to one meeting in a single call: article + article_plus + brief + headlines + review + transcript + related documents.
list_meeting_participants()
Roster members + staff for a meeting's committee, annotated with last-name mention counts in the transcript. NOT speaker attribution — Whisper doesn't produce turns.
search_roster_mentions()
Every meeting whose transcript mentions a roster member by last name, with snippets. Beat-prep tool; a mention is not a quote.
list_new_since()
Every pipeline artifact whose file mtime is on/after a timestamp — articles + article_plus + briefs + all four roundup families + documents. Polling primitive for newsletter automation.

Votes & Accountability (3)

list_votes()
Every roll-call vote extracted from a meeting's transcript, with per-member canonical name, vote (yes/no/abstain), motion context, and tally.
search_member_votes()
Every recorded vote by a named committee member across a town, with optional vote-value filter (e.g. only 'no' votes) — accountability journalism angle.
vote_stats()
Aggregate roll-call vote statistics: per-member yes/no/abstain counts + dissent rate, unanimous vs split motion counts, top-N contested motions. Uses the same extractor as list_votes.

Towns & Counties (8)

list_towns()
Unified overview of every town with pipeline coverage: meeting/document counts, latest meeting, county, bylaws flag.
list_committees()
All committees / boards / commissions covered for a town, with meeting counts and latest activity.
topic_timeline()
Bucketed hit counts (day/week/month/year) for a query across meetings + transcripts + documents. Trend framing for 'PFAS mentions per month over 3 years'.
list_counties()
List all MA counties with pipeline coverage and their member towns.
list_county_meetings()
Recent meetings across all towns in a county, aggregated newest-first.
search_county_meetings()
Full-text search across meeting articles for all towns in a county.
compare_town_profile()
Side-by-side comparison of 2-10 MA towns: DLS financials, meeting/committee activity, document count, and DESE school enrollment/MCAS — the cross-town snapshot in one call.
get_town_profile()
Single-call town overview: committee/meeting activity, document + bylaws coverage, DLS financials for the latest available fiscal year, and DESE school district enrollment/MCAS — a starting snapshot before drilling into the specialized tools.

Documents & Bylaws (7)

search_bylaws()
Full-text search across municipal codes, bylaws, and zoning regulations for 351 MA municipalities.
list_bylaw_towns()
List all MA municipalities with downloaded municipal codes / bylaws.
list_bylaw_chapters()
Table of contents for a town's municipal code (chapter titles, indexes).
get_bylaw_chapter()
Full text of a specific chapter from a town's municipal code.
search_documents()
Full-text search across 53,000+ harvested municipal documents (agendas, minutes, meeting packets) from 135 MA towns' CivicPlus AgendaCenters — the primary-source layer beneath the meeting articles.
get_document()
Full extracted text + metadata of one harvested municipal document by doc_id.
list_document_towns()
List MA towns with a harvested municipal-document corpus and their document counts.

Roundups (8)

list_recent_roundups()
Recent daily news-roundup dates for a town.
get_roundup()
Full daily news roundup for a specific date.
list_recent_sports_roundups()
Recent weekly sports-roundup periods for a town.
get_sports_roundup()
Full weekly sports roundup for a specific period.
list_recent_obituary_roundups()
Recent weekly obituary-listing periods for a town.
get_obituary_roundup()
Full weekly obituary listing for a specific period.
list_recent_realestate_roundups()
Recent weekly property-sales roundup periods for a town (84 MA towns via masslandrecords.com Laredo + Redfin).
get_realestate_roundup()
Full weekly property-sales roundup for a specific period.

Town Financials (DLS) (8)

list_dls_report_types()
List the five DLS (MA Division of Local Services) public financial report types available in the corpus.
list_dls_reports()
List all available DLS financial reports for a town (report_type, fiscal_year, label, fetched, chars).
get_dls_report()
Full text of one DLS financial report for a town and fiscal year -- property tax rates, levy limits, free cash, fiscal recaps. Primary-source filings, not AI summaries.
search_dls_reports()
Full-text search across DLS financial reports, filterable by town, report type, and fiscal-year range.
list_dls_metrics()
List all structured financial metrics extractable from DLS reports (for use with get_town_financials / compare_town_financials).
get_town_financials()
Structured financial metrics for a MA town for a fiscal year, parsed from DLS reports -- levy limit, tax-rate recap, free cash, approved tax rate, equalized valuation.
compare_town_financials()
Compare one financial metric across multiple MA towns (or a whole county) for a fiscal year, sorted and ranked.
get_town_financial_history()
Historical time series for one DLS financial metric (levy, tax rate, free cash, EQV, etc.) across fiscal years for one town — the trend complement to compare_town_financials.

Schools (DESE) (7)

compare_school_districts()
Side-by-side school snapshot for 2-10 towns: enrollment + demographics, per-pupil spending, avg teacher salary, Net School Spending ratio, MCAS, grad rate, student-teacher ratio, chronic absenteeism, accountability. Statewide baseline included.
get_school_climate()
Student attendance, discipline, restraints, and mobility for a town's district(s): chronic absenteeism, suspension/expulsion rates, school-level physical restraint counts with injuries, student churn.
get_school_districts()
The school district(s) a MA town belongs to — local, regional, and vocational. Essential first call before any other school-data tool; shows grade spans, enrollment, and member towns.
get_school_enrollment()
Public school enrollment history for a town's district(s): totals, grade breakdown, race/ethnicity, English learners, low income, high needs, and students with disabilities. DESE Oct-1 SIMS counts back to 1992.
get_school_finance()
School finance for a town's district(s): Chapter 70 state aid, Net School Spending required vs. actual, per-pupil expenditures by category, average teacher salary. The primary-source numbers behind every school-budget fight.
get_school_outcomes()
Post-graduation outcomes for a town's district(s): 4-year grad rates, dropout rates, plans of graduates, actual college enrollment (NSC match), SAT, AP performance, and MassCore.
get_school_staffing()
Educator staffing for a town's district(s): teacher FTE, student-teacher ratio, licensure share, staff race/ethnicity and gender diversity, average class size.

Ethics & Open Meeting Law (10)

search_oml_determinations()
Search MA Open Meeting Law complaints + dispositions by town — the AG's determinations and declinations (violation finding + remedies ordered), 2010-present. Filter by town, public body, type, violation, date.
get_oml_determination()
Full text + metadata of one OML determination/declination (the AG's ruling letter) by doc_id.
list_oml_towns()
List MA towns with a catalog of Open Meeting Law complaints and dispositions, with determination/declination/violation counts.
get_ethics_disposition()
Full record of one ethics enforcement case: findings of fact, conclusions of law, penalty, and the complete narrative text.
get_ethics_law_section()
Full statutory text of one section of G.L. c. 268A or c. 268B.
list_ethics_dispositions()
Catalog of MA State Ethics Commission enforcement cases (Disposition Agreements, Decisions & Orders, Public Education Letters) filterable by town, year, and case type.
list_ethics_law_sections()
Table of contents for the MA ethics laws: G.L. c. 268A (conflict of interest) + c. 268B (financial disclosure), with 930 CMR reference links.
list_ethics_towns()
Every MA municipality with at least one State Ethics Commission public enforcement case, with case counts.
search_ethics_dispositions()
Full-text search across the narrative text of every catalogued ethics enforcement case, statewide or per town.
search_ethics_laws()
Full-text search across the MA conflict of interest and financial disclosure laws.

Legal & Court Cases (2)

list_legal_cases()
Open + closed court cases involving a town's government, newest filing first -- cataloged from CourtListener (federal dockets + state appellate).
search_legal_cases()
Search cataloged court cases by party name, case caption, or nature of suit; scope to one town or every town with a legal-case catalog.

Environment (EEA) (12)

eea_town_overview()
Summary record counts across all 10 EEA environmental data categories for a MA town (permits, facilities, inspections, enforcements, asbestos, drinking water, lead/copper, well drilling, NPDES/PFAS, wetlands NOI). Live from the MA EEA Data Portal.
search_eea_permits()
Search MassDEP environmental permits by town — air quality, hazardous waste, pesticide, solid waste, water supply, waterways, wetlands. Live from EEA.
search_eea_facilities()
Search MassDEP-regulated facilities by town — hazardous waste generators, water suppliers, air emission sources, waste site cleanup locations. Live from EEA.
search_eea_inspections()
Search MassDEP inspections of regulated facilities by town — announced/unannounced, multimedia, complaint investigations. Live from EEA.
search_eea_enforcements()
Search MassDEP enforcement actions by town — consent orders, penalty assessments, notices of noncompliance, boil orders. Includes penalty amounts. Live from EEA.
search_eea_asbestos()
Search asbestos removal/abatement project notifications by town — contractor, quantities, disposal. Live from EEA.
search_eea_drinking_water()
Search drinking water quality test results by town — contaminant levels vs MCLs, PFAS, lead. Live from EEA.
search_eea_lead_copper()
Search lead and copper sampling results in schools and childcare facilities by town — tap-water concentrations vs action levels. Live from EEA.
search_eea_well_drilling()
Search well drilling records by town — well type, depth, bedrock, water level, lat/long. Live from EEA.
search_eea_npdes()
Search wastewater NPDES discharge and residuals PFAS analytical data by town — per-compound results from PFAS monitoring. Live from EEA.
search_eea_wetlands()
Search Wetlands Notice of Intent (NOI) filings by town — Conservation Commission filings for work near wetlands/waterways. Live from EEA.
get_eea_record()
Full details of a single EEA environmental record by type + ID — includes extra fields like DocumentLinks not in search results.

State Legislature (6)

get_legislature_article()
Full text of one AI-generated AP-style article covering a MA state legislature hearing or session — the article complement to get_legislature_transcript.
get_legislature_transcript()
Full Whisper transcript of one MA state legislature hearing or floor session by event_id.
list_legislature_transcript_folders()
List all MA state legislature transcript folders (hearings + sessions by chamber) and their event counts.
search_legislature_transcripts()
Full-text search across MA state legislature hearing and floor-session transcripts (raw Whisper output). Use get_legislature_transcript to read the match.
list_legislature_committees()
List MA state legislature committee/session categories with article counts — Joint Committee hearings, Senate/House sessions, etc.
search_legislature()
Full-text search across MA state legislature hearing and session articles — statewide, not town-scoped. Use alongside town meeting searches to find state-level activity on the same topics.

Civic Archives (7)

search_waylandarchive()
Search the town archive (6k+ historical agendas, minutes, packets, reports, pages from www.wayland.ma.us; 1985 to present).
get_archive_page()
Full text + metadata for a specific archive document by doc_id.
search_wells()
Search waylandwells.ma.townbrief.com (private-well monitoring hub — PFAS resources, committee history).
search_waylandpost()
Search 1000+ published articles on The Wayland Post (www.waylandpost.org). Every hit includes the canonical waylandpost.org URL.
get_waylandpost_post()
Full text of a Wayland Post article by slug (source: waylandpost.org).
search_waylandenews()
Search 5,500+ historical Wayland eNews posts (waylandenews.ma.townbrief.com legacy WP site; 2013-2024). Community events, school news, public safety, arts.
search_wvn()
Search wvn.ma.townbrief.com (Wayland Video News static site — About and Archive pages).

Search & Discovery (6)

get_town_calendar()
Upcoming town, arts, or library calendar events.
search_all()
Fan-out search across every corpus available for a town (meetings + transcripts + documents + bylaws + Wayland-specific archive/wells/waylandpost/enews/wvn); each hit tagged with source.
list_acfr_reports()
List a town's Annual Comprehensive Financial Reports (ACFR, formerly CAFR) -- audited annual financial statements. Currently Wayland only.
get_acfr_report()
Full text of a town's ACFR for one fiscal year (auditor's opinion, MD&A, fund statements, notes, RSI).
search_acfr_reports()
Full-text search across towns' ACFRs -- fund balances, revenues/expenditures, debt, pension/OPEB liabilities, auditor findings.
semantic_search()
Meaning-based search using AI embeddings — finds conceptually related meeting articles and roundups even when exact keywords differ (e.g. 'budget shortfall' finds 'fiscal deficit'). Covers all towns statewide.

Other (3)

get_mcas_results()
Next-gen MCAS results (2017-present) by grade and subject for a town's district(s): achievement-level shares, participation, and avg scaled score. m_plus_e_pct is the headline figure.
list_property_sales()
Historical property sales for a town, 2003-2024, from MA DLS's public LA3 Parcel Search — sale price, parties, and assessment data per transaction. No 2025/2026 yet (DLS lags ~18 months).
search_property_sales()
Search historical property sales by address, parcel ID, or party name — a specific town, or statewide across every town with DLS sales history.