✓ Published on the MCP Registry✓ Works with ChatGPT Actions

Give your AI assistant access to Massachusetts government data

Townbrief's MCP server puts 70research tools at your AI's fingertips — every town meeting transcript, every municipal bylaw, every vote, every ethics case, every school district report — across all 351 Massachusetts cities and towns.

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 Massachusetts 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 351 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 70 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 70 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 70 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 for Massachusetts. You have access to structured data from a journalism pipeline covering all 351 MA municipalities. 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 351 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

70 tools, 13 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 (6)

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.

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) (7)

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.

Ethics & Open Meeting Law (3)

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.

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.

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 (5)

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.