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 分

    请在仓库或注册中心条目中声明许可证。