✓ Published on the MCP Registry✓ Works with ChatGPT Actions

Give your AI assistant access to Massachusetts government data

Townbrief's MCP server puts 94research 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 94 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 94 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 94 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

94 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 (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.
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.
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.

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 all Dept. of Local Services (DLS) fiscal report types available in the corpus (levy limit, tax-rate recap, free cash, approved tax rate, equalized valuation).
list_dls_reports()
List available DLS fiscal-data reports for a town, by report type and fiscal year.
get_dls_report()
Full text of a specific DLS fiscal report for a town and fiscal year.
search_dls_reports()
Full-text search across DLS fiscal reports, optionally scoped by town, report type, or fiscal-year range.
list_dls_metrics()
List structured financial metrics extractable from DLS reports (levy, tax rates, free cash, etc.) — use with get_town_financials and compare_town_financials.
get_town_financials()
Structured financial metrics for a MA town and fiscal year, parsed from DLS reports — no PDF/narrative reading required.
compare_town_financials()
Compare one financial metric (e.g. tax rate, levy, free cash) across multiple MA towns for a fiscal year, optionally scoped to a county.
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)

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.
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.
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.

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.
list_ethics_towns()
Every MA municipality with at least one State Ethics Commission public enforcement case, with case counts.
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.
get_ethics_disposition()
Full record of one ethics enforcement case: findings of fact, conclusions of law, penalty, and the complete narrative text.
search_ethics_dispositions()
Full-text search across the narrative text of every catalogued ethics enforcement case, statewide or per town.
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.
get_ethics_law_section()
Full statutory text of one section of G.L. c. 268A or c. 268B.
search_ethics_laws()
Full-text search across the MA conflict of interest and financial disclosure laws.

Legal & Court Cases (2)

list_legal_cases()
Federal + state appellate court cases involving a town's government (CourtListener: D.Mass, 1st Circuit, SJC, Appeals Court), newest filing first. MA trial courts not covered (captcha-gated).
search_legal_cases()
Search cataloged court cases by party name, case caption, or nature of suit — a specific town, or statewide across every town with a 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 (3)

list_legislature_committees()
List available MA state legislature transcript folders (hearings + floor sessions by chamber) with event counts and date ranges.
search_legislature()
Full-text search across MA state legislature hearing and floor-session transcripts (Whisper-transcribed from malegislature.gov video). Filter by chamber, kind, committee, date.
get_legislature_transcript()
Full Whisper transcript of one MA state legislature hearing or floor session by event_id.

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.
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.
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.

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.