Tool reference
What each tool returns, what it costs, and the chains that answer questions people actually ask.
How to read this
You never call these by name. You ask a question and the assistant chooses; the names matter when you want to know what it did, or when you are deciding whether the toolset covers a job you care about.
Every tool is scoped to one state and one legislative session, resolved from your membership. Bill numbers may be written naturally — HB809, hb 809, and H.B. 809 all resolve to the stored HB0809, and an unparseable number returns an error rather than a near-miss match.
The 19 tools
search_billsstandardlegislation:readFind bills by structured filters: policy issue, sponsor, committee, status, filing date, significance, whether the bill is currently moving, whether it grows or shrinks government authority, and which way it leans.
Status means the stage a bill has *reached*, not where it sits today — a bill that passed the House and died in the Senate did pass the House, and both are worth being able to ask for. Long result sets are paged, with a cursor rather than a silent stop.
query · issueSlugs · statuses · sponsorName · committeeName · filedAfter · minSignificance · onlyMoving · governmentScopeDirection · lean · minLeanScore · maxLeanScore · limit · cursor
semantic_search_legislationexpensivelegislation:readSearches the full text of bills, amendments, and fiscal notes by meaning, for when a bill addresses a topic without using its obvious words. Returns passages with the bill they came from, and handles exact strings such as statute citations.
This is what keyword tracking systematically misses, and the reason a bill blindsides an organization in April.
query · documentTypes · topK
get_billstandardlegislation:readFull detail for one bill: sponsors, committee, status, action history, companions, policy tags, key provisions, scores, and which way the bill leans with the reasoning behind it. The right call before any specific factual claim.
The lean is a direction, not a recommendation — a bill can lean conservative and still be one an organization opposes. It carries a confidence, and is absent entirely for bills where the axis does not apply.
billNumber · billId
get_bill_textstandardlegislation:readThe actual text, by section and page. Use it when the exact wording matters — quoting a provision, checking what a section says, reading an amendment.
Long documents are paged and every response reports how much remains, so an agent cannot mistake page one for the whole bill.
billNumber · billId · documentRef · documentType · section · page · includeHistorical
get_bill_changesstandardlegislation:readAmendments filed against a bill, what each does, and whether it was adopted, withdrawn, or is still pending.
In Tennessee amendments are how bills change — there are no separately published revisions — so this is how you know a bill is still the bill you read.
billNumber · billId · adoptedOnly
get_bill_statute_changesstandardlegislation:readWhat a bill changes about the law that already exists — the current statute text, the proposed text, and a redline between them, per cited code section. Amendatory drafting ("Section 39-17-1359(b) is amended by deleting the second sentence") says nothing about what the sentence said; this does.
The redline is generated by a model from scraped statute text, so it is a reading of the change rather than the enrolled language, and the source URL travels with it. Every response says whether the bill was analysed at all — "no changes" is reported differently from "not processed" and from "this state is out of scope", because an empty list otherwise reads as a bill that leaves current law alone.
billNumber · billId · sectionNumber · includeFullText · page
compare_billsstandardlegislation:readTwo to five bills aligned side by side — provisions, statutes touched, status, scores — plus which are companions and how textually similar they are.
One call instead of several lined up by hand, which is where transcription errors creep in.
billNumbers · billIds
get_similar_billsstandardlegislation:readBills whose text and policy resemble a given bill, ranked, with companions labelled.
Similarity shows resemblance only. It is never evidence of coordination or of model legislation.
billNumber · billId · limit
get_votesstandardvotes:readTotals by chamber and party, who voted against, who was absent, and any party defectors. Ask for every member and how they voted to build a whip count.
Where a source published only a tally, the member list comes back empty and flagged — so an empty dissenter list on a 12–4 vote reads as "the names were not published", never as "nobody dissented".
billNumber · billId · rollCallId · legislatorNames · includeAllVoters
get_legislatorstandardlegislators:readA member’s profile plus sponsorship and voting activity this session: bill counts, top policy areas, and how often they vote against their own party. Omit the name to rank a whole caucus instead of asking member by member.
Breaking with the party counts only votes actually cast against it. Not Voting and Absent are reported separately, never as breaks — counting them was inflating members who simply miss votes into apparent mavericks.
name · peopleId · includeCommittees · party · chamber · sort · limit · cursor
get_legislator_dissentsexpensivevotes:readThe specific roll calls where a member voted against their own party — the bill, the date, how they voted, what their party voted, what the other party voted, and which way the bill leans. Filter to breaks on conservative-leaning bills where the member crossed to the other side, and the scorecard question answers itself.
Each break says whether the member crossed to the other party’s majority, and how many of their own party broke with them. A lone crossover and a break twenty colleagues joined are different findings, and a rate alone cannot tell them apart.
name · peopleId · crossedOnly · billLean · minSignificance · limit · cursor
get_vote_alignmentexpensivevotes:readHow closely two voting records agree — one member against another, a whole caucus ranked by how often they vote with someone, or every member ranked against your own recorded support and oppose positions. The whip-count tool: who is reliable, who is a swing, and which bloc a member actually votes with.
Quote the contested rate, not the raw one. Roughly four in five roll calls pass unanimously, so raw agreement mostly measures uncontroversial business — it makes a Republican and a Democrat who oppose each other on everything contested look like 86% allies. On contested votes that same pair is 28%. Both numbers are returned; only one of them means anything.
name · peopleId · compareToName · compareToPeopleId · compareToPortfolio · party · chamber · issueSlugs · billLean · minSignificance · limit
get_committeestandardcommittees:readMembership with chair and vice chair, bills pending before it, and scheduled hearings. Searching bills tells you what sits in a committee; only this tells you who decides.
The roster is reconstructed from the roll-call record for the session — who actually sat on the panel, not who sits today. 43% of the member-committee pairs the Tennessee record evidences are absent from present-day rosters.
name · committeeId · include · limit · asOf
get_policy_frameworkcheaplegislation:readThe conservative position framework this organization measures legislation against — scope, principles, the bright-line support and oppose rules, Tennessee’s legal landscape, and the traps — across 13 policy domains. Ask for a domain by name, or pass a bill and get the framework for its own domain.
The bill tools are deliberately descriptive and carry no position. Without this an assistant judging whether something is "conservative" is using its own idea of the word rather than yours.
domain · billNumber · billId · includePrinciples
get_recent_legislative_activitystandardlegislation:readBills filed, actions taken, votes recorded, amendments filed, hearings scheduled. The starting point for "what changed this week", rather than searching text.
sinceDays · issueSlugs · limit · cursor
get_legislative_calendarstandardlegislation:readWhat is scheduled and when, across every bill at once — committee and floor calendars, filterable to a committee, an issue, named bills, or just the ones your organization tracks. One call in place of asking each committee separately and merging the answers.
The structured calendar feed this state publishes is nearly empty, so most events are recovered from the wording of the action record itself. Each event says which source it came from. An empty result reports the dates the record does cover, so a recess reads as a recess rather than as an absence of data.
from · to · committeeName · issueSlugs · billNumbers · minSignificance · onlyTracked · limit
aggregate_legislative_dataexpensiveanalytics:readCounts, averages, and outcome rates across the session, computed in the database rather than sampled from a page of results — grouped by issue, committee, sponsor, party, status, month, or which way bills lean. Pass and fail rates by referring committee answer the chokepoint question: where do our bills actually die. Filters combine, so two-dimensional questions are a single call.
Models miscount, so anything that can be arithmetic is done in SQL. Rates come with their denominator and are associations rather than causes — a committee with a high pass rate may be advancing bills, or may simply be where bills are sent once leadership has already decided to move them, and this data cannot tell the two apart.
metric · groupBy · issueSlugs · party · lean · statuses · committeeName · filedAfter · filedBefore · limit
get_org_portfoliocheaporg:readYour organization’s own tracked bills, issue portfolios, and positions — what you support, what you oppose, and how much you care.
Reachable only through a connection you signed in to from the AI app. A pasted token can never read it.
portfolioName · onlyTracked · limit · cursor
get_org_legislator_intelstandardorg:readWhat your organization knows about one legislator that the public record does not — the notes your staff recorded, how many of your supporters live in their district and how many have contacted them, and how they voted on the bills you took a position on. The brief you want before a district meeting.
Reachable only through a connection you signed in to from the AI app; a pasted token cannot see it at all. A zero supporter count usually means addresses have not been geocoded rather than that nobody there supports you, and the response says so — the two read identically and lead to opposite decisions.
name · peopleId · noteType · limit
Playbook
Each of these is one question. The chain underneath is what the assistant runs on its own — you do not orchestrate it.
The Monday morning briefing
“What moved last week on our issues, and what needs a decision from us before Thursday?”
get_org_portfolio → get_recent_legislative_activity → get_bill ×N → get_committee
Your tracked bills crossed against the week’s actual movement, with hearings before your deadline surfaced first. Replaces the manual pass through a tracking list every Monday.
The whip count
“On HB 809 — who voted for it, who broke with their party, and who is worth a call?”
get_votes (includeAllVoters) → get_vote_alignment → get_legislator_dissents
Every member named with their vote, then ranked by how often they actually vote with the members you can already count on. Quote the contested rate: four in five roll calls pass unanimously, so a raw agreement figure makes opponents look like allies. A no vote from someone who never breaks ranks is a very different call from one who breaks routinely.
Is this still the bill we endorsed?
“HB 1729 has been amended twice since we took a position. What changed, and does our support still hold?”
get_bill_changes → get_bill_text → get_org_portfolio
Each amendment, whether it was adopted, and the current text of the sections it touched, set against the position you actually recorded. Catches the quiet gutting amendment that turns a supported bill into one you would oppose.
Companion divergence
“Do the House and Senate versions of the school choice bill still match?”
search_bills → compare_bills → get_bill_changes ×2
The two bills aligned provision by provision with similarity scored, plus the amendments that pulled them apart. Answers which chamber’s version you should be lobbying.
Finding what you did not know to look for
“Is anything this session quietly expanding civil liability for small employers?”
semantic_search_legislation → get_bill ×N → get_bill_text
Bills matched on meaning rather than keyword, so one that never says “small employer” still surfaces.
Reading the committee before you walk in
“Brief me on House Education Administration before Wednesday’s hearing.”
get_legislative_calendar → get_committee → get_vote_alignment
What is actually scheduled and when, who sits on the panel, who chairs it, and how each member votes relative to the ones you already know. Turns a roster into a vote map.
Session-scale pattern questions
“Which committees are the real chokepoints for our issues, and who sponsors the most bills in them?”
aggregate_legislative_data ×2 → get_committee
Counts computed across the whole session rather than sampled from a page of results. Informs where relationship-building actually pays off next interim.
Where our bills die
“Which committee is the chokepoint for our issues, and what happens to bills that reach it?”
aggregate_legislative_data (fail rate by referring committee) → get_committee → get_vote_alignment
Pass and fail rates by the committees a bill was actually referred to, with the number of bills behind each rate, then who sits on the worst of them. Note that a rate is an association: a panel may be killing bills, or may be where bills are sent once leadership has already decided they are going nowhere.
Is this member with us?
“Before I meet Rep. Smith — what do we know, and how has she voted on our bills?”
get_org_legislator_intel → get_vote_alignment (compareToPortfolio) → get_legislator_dissents
Your own meeting notes, how many of your supporters live in her district and how many have contacted her, and her record against the positions you recorded — with a vote she never cast counted as a missing vote rather than as a vote against you.
What does this actually change about current law?
“HB 1729 amends three code sections. What do they say now, and what would they say?”
get_bill → get_bill_statute_changes → get_bill_text
The existing statute text, the proposed text, and a redline per cited section — the thing amendatory drafting cannot tell you, because "is amended by deleting the second sentence" says nothing about what the sentence said.
The week ahead
“What is on the calendar next week for anything we are tracking?”
get_legislative_calendar (onlyTracked) → get_bill → get_committee
Every scheduled hearing across your tracked bills in one call rather than one call per committee. An empty week reports the dates the record does cover, so a recess is distinguishable from missing data.
Drafting grounded in the record
“Draft talking points opposing HB 809, quoting the liability language exactly.”
get_bill → get_bill_text → get_votes → the agent writes
Talking points where every quotation is verbatim from the bill and every vote count is the recorded one. The agent writes the argument; it does not invent the facts.
Guardrails worth knowing
The agent is told when the record is silent
Roll calls report whether member-level detail exists. When a source publishes only a tally, the member list comes back empty and flagged — so an empty dissenter list on a 12–4 vote reads as “the names were not published”, never as “nobody dissented”. Without that distinction a model will confidently report a contested vote as unanimous.
Committee rosters are as of the vote, not as of today
Membership is reconstructed from the roll-call record, so a March vote is analysed against the panel that actually sat in March. Where no roll-call evidence exists, the response says so rather than implying history it does not have.
Agreement is measured on the votes that were contested
Roughly four in five roll calls pass unanimously, so a raw agreement rate mostly measures uncontroversial business — it makes a Republican and a Democrat who oppose each other on everything actually fought over look like 86% allies. On contested roll calls that same pair is 28%. Both figures are returned, rankings sort on the contested one, and every response says which to quote.
An empty answer says why it is empty
Nothing scheduled, a window outside the dates we hold, filters that excluded everything, and a bill never analysed against current law are four different things that all look like an empty list. Each is reported as itself, with the range the record does cover. Without that, "no hearings scheduled" and "we have no calendar data" are indistinguishable to a model, and it will state the first one.
A missed vote is never counted as opposition
Not Voting and Absent are excluded from both sides of every ratio — party-break rates, agreement rates, and alignment against your own recorded positions. A member who was not on the floor appears as having cast no vote, not as having voted against you. Counting absences as breaks was inflating quiet members into apparent mavericks.
Citations are grounded by construction
Tools return the entities they legitimately exposed. A citation to a bill, member, or vote the agent was never shown is rejected rather than rendered, so a plausible-looking reference cannot be fabricated.
Retrieved text is data, not instruction
Bill text, amendments, and fiscal notes are material to analyse. Text inside a document that tries to issue instructions is analysed, not obeyed.
Your queries are not retained
Requests are audited for abuse and metering — tool name, cost class, duration — but tool arguments are deliberately never stored. Which bills you are watching and which members you are counting is the sensitive part of an advocacy organization’s traffic, and the safest place to keep it is nowhere.
Access follows your staff roster
Entitlements are re-resolved from live membership on every request. A staffer who is removed or demoted loses access at the same moment they lose the interface, without anyone revoking a credential by hand.
Limits, plainly
- One state and one session per connection, resolved from your membership.
- Rate limits apply per connection, per account, and per organization — a second connection does not buy a second budget.
- Read-only. No tracking, alerting, position-setting, or scheduling.
- Member-level votes exist only where the source published them.
- Similarity is resemblance, not evidence of coordination.
- Significance is not likelihood of passage — a bill can matter and be going nowhere.
- Organization data requires a signed-in connection plus the organization opt-in.
- Positions are not decided here; full support and oppose analysis lives in the app.
- Comparison against current law covers Tennessee only, and reports when it has not run rather than returning an empty result.
- The hearing calendar is largely reconstructed from the action record, because the structured feed this state publishes is nearly empty. Each event says which source it came from.
- Rate limits are per connection, per minute, by cost class: 120 cheap, 90 standard, 20 expensive, 150 in total.
