Archive

org.lunenburgbudgetproject由 lunenburgbudgetproject.org 發布官方發布者v1.0.0更新於 Nov 2, 2026

The Lunenburg, Massachusetts town and school budget, every figure traced to its source document.

已驗證Streamable HTTP可網頁執行金融知識與記憶資料與分析

概覽

AI 產生的概覽

麻薩諸塞州 Lunenburg 鎮與學校預算的唯讀檔案,讓助理列出資料集、執行 SQL 查詢並引用來源文件。

可以做什麼
  • 列出檔案中每個資料集及其涵蓋年份、列數與大小
  • 讀取各資料表的粒度說明與已知陷阱,以及 107 個附 SQL 的範例問題
  • 對檔案資料庫執行一條唯讀 SQL 查詢(僅 SELECT 或 WITH)
  • 依年份與單一階段(proposed、settled、actual)查詢某預算科目的歷史
  • 依年份、學校與職務分類統計名冊上列出的學校教職員人數
  • 在 1,422 份鎮民會議文件中檢索關鍵字,回傳委員會、日期與可引用連結
適用情境
適合回答關於 Lunenburg 鎮或學校預算、支出歷史、教職員人數以及鎮委員會討論內容的問題,且數字需可追溯至來源文件。它只涵蓋單一城鎮,適合研究與公民報導,而非一般財務工作。
執行需求
專案網站上的遠端 streamable HTTP 端點;未宣告任何套件、帳號、API 金鑰或環境變數。助理需要能連線至該端點的網路。
安裝前請注意
query 工具會對檔案執行 SQL,但僅限唯讀的 SELECT 或 WITH 語句,會自動加上列數上限,預估讀取超過 250,000 列時會被拒絕。結果受檔案完整度限制:會議文件自 2025 年 1 月起,檢索無結果只表示索引中沒有該詞,不代表沒有人說過。預算數字為扣除補助與規費後的淨額,不可與決算數混算。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Archive,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/org.lunenburgbudgetproject%2Farchive/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "archive": {
      "type": "http",
      "url": "https://lunenburgbudgetproject.org/mcp"
    }
  }
}

README

The Lunenburg Budget Project

An independent, checkable archive of the Lunenburg, Massachusetts town and school budget: 47,181 documents, 380 datasets, and 12,273 agendas and sets of minutes across 51 town boards. Not affiliated with the Town of Lunenburg, the School Committee or the school district.

The site is https://lunenburgbudgetproject.org. This repository is everything behind it.

Start there: the data API · an MCP server · every published address · the guide for agents.


If you are an agent, start here

Read fy28/public/llms.txt first. It is written for you: what this archive holds, what it does not, and the specific ways to get a confident wrong answer out of the data.

If you can reach the site, use it — every address below has a live equivalent and the site serves smaller, indexed forms. If you can only reach GitHub, fetch raw files directly; no clone is needed:

https://raw.githubusercontent.com/tjloughlin16/lunenburgbudgetapp/main/<path>
you wantfetch
what this holds, and its limitsfy28/public/llms.txt
every dataset, with row counts and sizesfy28/public/api/tables.json — 173 of them
the grain of every table, and the trapsfy28/public/api/schema.json
every figure the site computesfy28/public/data/model/index.json — 38 sections, one file each
every source document, with its sha256sources/data/archive-manifest.csv
which meeting documents mention a wordfy28/public/minutes/find/README.txt

Nothing in fy28/public/api/ is larger than one fetch. Anything that would be is split — staff_roster_entries.json is an index and staff_roster_entries/2022.json is that year.

The documents themselves are not in this repository. 47,181 files, 1.47 GB, live in a public object store; sources/data/archive-manifest.csv lists every one with its sha256 and python3 scripts/sync_archive.py --pull fetches them. The extracted text IS here, under sources/*/text/, and that is what the analysis reads.

Where things are

sources/the archive, keyed by how a document reached us — see sources/README.txt
sources/data/380 datasets extracted from those documents, CSV
sources/analyses/the written analyses, each with a verifier script
model/the projection — python3 model/export.py writes fy28/src/data/model.json
scripts/extraction, verification and publishing
fy28/the site: React app, Cloudflare Pages Functions, and everything published
notes/working notes; notes/reference/ is generated
plans/what is being built and why

The rules this project works under

CLAUDE.md carries them in full and each one exists because it was learned by getting it wrong here. The four that matter most to anybody reading the data:

  1. Never mix budgets with actuals in one calculation. They differ by up to 59% on some lines, and a growth rate measured from one to the other is partly growth and partly the step between them.
  2. A budget line is NET, and it is dollars. It is what the town must raise after grants, fees and state aid — not what the thing costs, and never a count of people.
  3. Only facts are stated as facts. A number computed from the data is a fact; an explanation for why it moved is a hypothesis, and it is labelled as one.
  4. Every figure is interpolated from the model, never typed into prose. Including the counts in this file.

Running it

npm install --prefix fy28python3 scripts/sync_archive.py --pull      # the documents; the manifest says whatpython3 model/export.py                     # -> fy28/src/data/model.jsonnpm run --prefix fy28 build:site            # -> fy28/dist

CLAUDE.md lists every check. The ones that guard what this file describes:

python3 scripts/build_readme.py --check       # this file, against the repositorypython3 scripts/build_api.py                  # every dataset, fetchablenode fy28/scripts/check-agents.mjs            # every advertised URL answers, and can be readpython3 scripts/check_archive_storage.py      # the archive against its manifest

Generated by scripts/build_readme.py. Edit that, not this.

來源:README.md,提交 5695ceb

工具

8

list_datasets

Every dataset in the archive, with THE YEARS EACH COVERS, its row count and its size. Call this before answering from prose: it is how you find out whether the archive holds data for the year and subject you are being asked about. 49 datasets covering the town and school budgets, the town ledger, staff rosters, out-of-district placements, elections, and fifteen years of annual town reports.

無需輸入參數。

read_first

The grain of every table and the specific ways to get a confident wrong answer out of this data. Read this before computing anything. It states, among others, that a budget and an actual must never be combined in one calculation; that a budget line is NET of grants and fees and is not what a thing costs; and that no budget line is mapped to a ledger account, so budget-to-actual at line level cannot be answered from this data at all.

無需輸入參數。

worked_examples

107 questions this archive can answer, each with the SQL that answers it. Every one is executed against the database on every build, so none of them is a claim. Start from the nearest one and edit it rather than writing a query from scratch.

無需輸入參數。

search_meetings

Which of the 1,422 published town meeting documents contain a word — every board, 2025 onward. Returns the board, the date and a citable URL for each. AN EMPTY RESULT MEANS THE WORD IS NOT IN THE INDEXED DOCUMENTS, which is not the same as nobody having said it: the archive starts in January 2025. It matches words exactly, so plurals are separate terms — search "jersey" and "jerseys" both.

輸入參數word必填board

budget_history

What a school budget line was in each year, AT ONE STAGE. The stage argument is required and singular on purpose: `proposed`, `settled` and `actual` are three different documents about the same year, and a growth rate measured from an actual to a budget is partly growth and partly the step between them. That mistake put a special education escalator 1.5 points too high here and was invisible until somebody asked how the number was derived. Note also that a budget line is NET — what the town must raise after grants, fees and state aid — so a line can rise because a grant ended rather than because anything cost more.

輸入參數label必填stage必填

staff

How many people the town PRINTED on a school staff roster, by year, school and kind of job. Uses our classification of the printed title, never the title itself, because the town has called the same job Tutor, Aide, Paraprofessional, Para, (para) and Sped Para across fifteen years. THIS IS A COUNT OF NAMES, NOT A STAFFING LEVEL: a roster carries no FTE, so a 0.4 music teacher and a full-timer are one row each, and it names no funding source, which is the question that usually matters. Grade appears only where the page happened to print it.

輸入參數fycategory

document

Where a document came from: the publisher's URL, our copy, and its sha256 so a reader can check they have the same bytes. Use it to cite anything.

輸入參數name必填

query

Any question the other tools do not cover, as one read-only SQL statement over the archive database. SELECT or WITH only; a LIMIT is imposed if you omit one. Call `read_first` before computing anything and `list_datasets` to find table names. A query estimated to read more than 250,000 rows is refused — narrow it with a WHERE, or ask for one table at a time.

輸入參數sql必填

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。