Demo script — Council District 10 (Carmen N. De La Rosa)

DRAFT. First pass, 2026-07-21. A run-it-live script for showing BetaNYC’s grounded AI + NYC/NYS open data MCPs to Council Member Carmen N. De La Rosa and staff. District 10 covers Washington Heights and Inwood in Northern Manhattan.

Every number in this script was pulled live on 2026-07-21 and is reproduced in the presenter notes. If a live call disagrees with a figure here, trust the live call and say so out loud — that is the demo working, not failing.

Companion to the general ../user-journeys.md catalog, framed for a Council audience: their district’s data, their own legislation, their discretionary funding, their oversight.


Before you start (2 min)

Opening line:

“I’m going to ask an AI the questions your office fields every week — but this one is wired into the actual city and state record. Watch where the numbers come from.”


Act 1 — Your district, right now (3 min)

Prompt:

“What were the top 311 complaint types in Council District 10 over the last 30 days?”

Expected shape of the answer (verified 2026-07-21, 30 days back from that date — your run will differ):

Complaint type Count
Noise – Street/Sidewalk 2,711
Water System 1,141
Noise – Residential 930
Illegal Parking 735
Illegal Fireworks 523

10,357 service requests in the district over the window.

What to say: “Live 311 data — the same complaints your constituents file every day, summarized in one question. Ten thousand requests in thirty days in your district alone.”

Where to linger: Water System at #2 is unusual and specific to Northern Manhattan’s older infrastructure. If the office reacts to it, that is your Act 4 topic — follow it.


Act 2 — Grounded vs. ungrounded (2 min)

Prompt:

“What NYC Council legislation on broadband access has been enacted recently, and is Council Member De La Rosa on it?”

The verified answer: Int 1122-2024 — “a plan for expanding home access to broadband internet” — Enacted 2025-11-08, Committee on Technology. De La Rosa is among 28 sponsors.

What to say: “An ordinary chatbot will invent a bill number or hand you last term’s list. This one reads the Council’s own Legistar system — real Intro number, real enactment date, real sponsor list you can cite in a press release without checking.”

The reveal: open intro.nyc/1122-2024. The URL resolves, the status matches. That short-link pattern is much better on a projector than a Legistar LegislationDetail.aspx URL.


Act 3 — Your funding, from allocation to check (5 min)

The act a Council audience cares about most, and the strongest one in this script because it closes the loop.

Step one — the allocation

Prompt:

“Show the FY2026 NYC Council discretionary (Schedule C) awards sponsored by council member De La Rosa.”

The verified answer, re-verified live 2026-07-21: 105 awards, $2,165,000 total.

⚠️ Corrected — this was wrong by $1.2 million. This script previously said “12 awards, $960,000.” Re-running search_awards(council_member="De La Rosa", fiscal_year=2026, limit=500) returns 105 awards, $2,165,000.

Unlike the District 4 error, this one is not limit truncation — 12 is below any default limit. The underlying data has not changed since 2026-07-19 and the query code was never touched, so the original figure was wrong when it was written. The same wrong figure is published in New-York-City-Budget#37, where it was used as the example of the correct parameter working properly.

The table below was internally inconsistent with it: the first five rows alone total $742,000.

The largest and most characteristic:

Amount Recipient Purpose
$500,000 Catholic Charities Community Services, Archdiocese of NY Alianza Cultural Center
$87,000 Department of Sanitation Additional sanitation, CD 10
$55,000 Center for Employment Opportunities Cleanup services, CD 10
$50,000 Dominican Women’s Development Center Anti-domestic violence program
$50,000 Northern Manhattan Coalition for Immigrant Rights Domestic abuse survivors programming
$30,000 Community League of the Heights (CLOTH) CD 10, NYC Cleanup
$25,000 Friends of WHEELS College & Career Pathways
$25,000 NYC First, Inc. Youth Robotics Leagues & STEM, CD 10

What to say: “That is your office’s Schedule C, by organization, by dollar, by agency — the list your budget director keeps in a spreadsheet.”

The BetaNYC-relevant beat, if you want it. Four FY2026 awards sit under the Digital Inclusion and Literacy Initiative, $90,000 in total (re-verified live 2026-07-21):

Amount Recipient Program
$25,000 Friends of WHEELS College & Career Pathways
$25,000 NYC First Youth Robotics Leagues & STEM
$20,000 Business Outreach Center Network Women’s Digital Cooperative for Economic Empowerment
$20,000 Renaissance Technical Institute Workforce Training

That is digital equity funded at the district level, and it is the natural bridge to what BetaNYC does. Corrected: this previously read “the last two awards… $50,000.” The other two sat below the truncation line described above, so the error understated her digital-equity commitment by $40,000 — in the direction least favorable to the member, in her own office.

Step two — the check

Prompt:

“Now check NYC Checkbook for FY2026 spending paid to Community League of the Heights.”

🚨 CHECKBOOK IS RETURNING HTTP 403 AS OF 2026-07-21 21:00. THIS STEP WILL FAIL LIVE. Verified three times: search_spending(payee_name=…, fiscal_year=2026), and also with no payee filter at all (fiscal_year + agency_code only). It is not payee-specific and not the previously-known smart_search WAF block — the structured spending endpoint itself is blocked. The figures below could not be re-verified today and are carried forward from 2026-07-16.

The response shape is the dangerous part. It returns total_records: 0, records: [], has_more: false alongside an error: "HTTP 403" field. An agent that reads the count and not the error will report “no city payments to this organization” — a false negative, in the member’s office, about her own district’s funding.

Diagnosed 2026-07-21: this is bot protection, not an outage. checkbooknyc.com loads normally in a browser while curl gets 403 from the same machine — the homepage, not just /api, and a Chrome User-Agent does not help. Incapsula’s JavaScript challenge: a browser passes it, an API client cannot. Assume it stays broken. It is not something we will work around.

The fallback is good, so use it deliberately. The data is public and reachable — just in a browser, not through the tool. Keep checkbooknyc.com open in a tab, run step one for the allocation, then pull up the payment in the browser yourself. Narrate the split honestly: “the allocation side is queryable; for the disbursement side the city’s own site blocks automated access, so here it is by hand.” In a room that just watched an agent refuse to guess, showing where the automation stops is on-message rather than an apology.

If you would rather not switch surfaces, end Act 3 on the allocation — it is fully verified and lands on its own.

The answer as of 2026-07-16 — NOT re-verified, see the warning above: 32 payment records in FY2026, including:

Amount Agency Budget code
$238,840.00 DYCD 3548 (SONYC Public Schools) — COMPASS Program
$139,040.20 DYCD 9825 (Boro Needs)
$107,244.16 DYCD 3625 (Tax Levy Elected Officials)
$46,500.00 DYCD 9825 (Boro Needs)
$33,000.00 DYCD 3625 (Tax Levy Elected Officials)

What to say — this is the payoff, so slow down:

“Look at the budget code on those two. Tax Levy Elected Officials. That is discretionary money — Council member money — showing up as an actual check to an actual organization in your district. We just went from where the money was allocated in the adopted budget to where it was spent, across two separate city systems, in two questions. That is the reconciliation your office does by hand.”


Act 4 — An issue you’re working on, sourced (4 min)

Ask the office for a live priority. If they don’t offer one, Water System complaints from Act 1 is a strong default for this district.

Prompt:

“For Council District 10 and the issue of [ISSUE]: pull recent 311 data that quantifies it, find any related NYC Council legislation and upcoming hearings, and check NYS Open Legislation for a state bill on the same topic. Give me a short, sourced brief.”

What to say: “Every line traces to an official source — city data, the Council’s own system, and Albany’s. If staff challenges a number, the agent shows where it came from.”

Honest caveat to say out loud if the brief looks thin: “Notice it didn’t pad. When there’s no state bill on the topic, it says so instead of inventing one. That restraint is the whole product.”


Closing (1 min)

“BetaNYC built these connectors and guides in the open. Any office can point its own AI at the real city and state record instead of trusting it to remember. If there’s a question your team asks constantly, that’s exactly the kind of user journey we want to add.”

Leave-behind links:


Presenter notes (verified 2026-07-21)

Read this section before presenting. Every item below was found by dry-running the prompts live. Several are silent failures — the tool returns confident, real-looking, wrong-question data with no error.

✅ Fixed 2026-07-21 — the thing that used to bite you here

These servers used to accept parameters that were not in their schema, ignore them, and return unfiltered results with no error. An agent that guessed a plausible parameter name got plausible garbage.

This was found the hard way on 2026-07-21, in this very script: search_awards(council_district=10) returned $47.5M of citywide awards, which an agent would happily summarize as District 10’s funding. It was exactly the failure this repo warns about, occurring inside our own tooling.

Now fixed and published. nyc-budget-mcp 1.3.0 (PR #40) rejects council_district and points at council_member. All seven servers got the same treatment on 2026-07-21 — minimum versions: budget 1.3.0, council 2.5.0, checkbook 1.4.0, record 1.1.0, 311 1.1.0, charter 0.2.0, nys 2.3.0. Verified live against the published packages.

Run /mcp-update and confirm your versions before presenting. These load via npx -y, so a stale cache can still serve an old build — and on an old build the $47.5M answer comes back with no warning.

Worth doing on purpose in the room. Asking for District 10’s awards by district and having the tool refuse and name council_member is a better trust argument than any successful query. It is the whole thesis of this repo, demonstrated on our own software.

The correct parameter names, re-verified 2026-07-21:

Task Correct parameter Do not use If you get it wrong
Schedule C awards by member council_member="De La Rosa" (surname substring) council_district, sponsor rejected by name (fixed)
Checkbook payments to an org payee_name="COMMUNITY LEAGUE OF THE HEIGHTS" vendor rejected by name (fixed)
Socrata aggregate query separate select / where / group / order / limit a single soql blob ⚠️ still silently ignored — third-party server

There is no district filter on the budget tool, by design — Schedule C keys on sponsoring member, not district. The agent must map district → surname first. That is worth narrating out loud as a feature: the money follows the member.

Per-tool notes

Figures and their provenance

Claim How verified
De La Rosa = District 10, PersonId 7806 get_council_member, Legistar record
105 FY2026 awards, $2,165,000 search_awards(council_member="De La Rosa", fiscal_year=2026, limit=500) — re-verified live 2026-07-21; returned 105 against a limit of 500, so complete. Supersedes “12 awards, $960,000,” which was wrong
CLOTH Checkbook payments incl. Tax Levy Elected Officials search_spending(payee_name=…, fiscal_year=2026), 32 records
Int 1122-2024 enacted 2025-11-08, De La Rosa a sponsor search_legislation("broadband")
311 top complaints, 10,357 total Socrata erm2-nwe9, is_sample: false

Not independently verified this session: the precise neighborhood composition of District 10. “Washington Heights and Inwood” is supported by the member’s district office address (618 W 177th St, 10033) and by a District 10 award to the Washington Heights BID, but the district’s full boundary was not checked against a districting source. Don’t recite a neighborhood list to a room that knows the district better than you do.


Backup prompts (if one falls flat)