va-lis-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LIS_API_KEY | Yes | Your LIS API key (a GUID). Required for all requests. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_current_sessionA | The General Assembly's current working session. During the interim this is the upcoming session, not the one that just ended; continued bills and new prefiles accumulate there. For retrospective work on a finished session, pass that session's code to the other tools instead of relying on this default. |
| list_sessionsA | Legislative sessions for a calendar year. Returns each session's code, e.g. 20261 = 2026 Regular Session and 20262 = 2026 Special Session I. The reference list reaches back to 1994. |
| get_sessionC | One session with its milestone dates: prefiling, convening, adjournment.
|
| list_billsA | List bills in a session, optionally filtered by a search term.
|
| search_billsA | Search a session's bills by keyword, stage, patron, or chapter number. This is the full text search; list_bills only matches the number and the
short description. One row per bill, in LIS order, with status, chapter, chief patron, and
the committee that holds the bill. |
| list_most_viewed_billsA | The bills of a session that readers of the LIS website open most often. LIS sends at most 100, in its own order, with the same fields as search_bills. The list measures public attention, not legislative weight. |
| list_amended_billsA | Every bill in a session that carries an amendment, with its amendments.
|
| list_conference_billsA | The bills of a session that went to a conference committee. A conference committee settles the differences when the two chambers pass
different versions of a bill. |
| get_billA | Full detail for one bill: title, status, dates, patrons, session lineage.
|
| get_bill_patronsA | Every patron of a bill with their member ids, in LIS display order.
|
| get_bill_summariesB | Plain-text summaries of a bill (as introduced, as passed, ...). The entry with |
| get_bill_textA | Full text of one bill version, HTML stripped to plain text.
|
| get_bill_versionsA | Every published version of a bill, oldest first, with links to its files. Introduced, each substitute and amendment, engrossed, enrolled, and
chaptered. Each version carries the address of its |
| get_bill_historyA | Chronological action history for a bill, from prefiling to governor action. Passage dates live here (the bill detail's passage date fields are always
null in LIS): look for events with |
| get_bill_votesA | Every recorded vote on a bill, in both chambers, in chronological order. Floor, committee, and subcommittee votes all appear. |
| get_bill_vote_talliesA | A bill's votes with their tallies and no members, in two requests. The fast route to how a bill fared at each stage: committee,
subcommittee, and floor votes from both chambers, oldest first. It is
lighter than get_bill_votes and it knows less. Most voice votes are
missing, there is no pass or fail flag (read |
| list_votesA | Every vote a chamber took in a date range: floor, committee, and subcommittee. Dates are |
| get_roll_callA | Who voted which way on a bill, with party and district, one entry per vote. Members are grouped under |
| get_member_votesA | Every vote one member cast in a session, or their votes on one bill. Floor, committee, and subcommittee votes all appear, in LIS order. A row
is one (vote, bill) pair: a block vote that disposed of 105 bills appears
105 times, each with |
| list_membersA | The session's member roster, searchable by name, chamber, and party.
|
| get_memberA | One member's roster record: name, chamber, party, district, status, contact. Reads the session roster, which is the authoritative source (LIS's by-id endpoint answers nothing for some sitting members). Use get_member_committees for seats, get_member_bills for patronage, get_member_votes for the voting record, and get_member_office for the district office. |
| get_member_officeA | A member's district office: postal address, phone, and email. The district office is the contact detail LIS publishes nowhere else;
get_member has the Capitol room, phone, and email. The record is not
session scoped, so there is no session code. Many members have no record,
and |
| get_member_billsA | Every bill a member patrons in a session, in any role. The session bill list names only chief patrons, so this is the route to
a member's co-patronage. |
| get_member_committeesA | Every committee seat one member holds in a session, with the role. LIS has no member-first committee endpoint, so this reads every seat list in the member's chamber: 14 requests cold for a House member, 67 with subcommittees, all cached afterwards. |
| list_committeesA | The standing committees of one or both chambers, optionally with subcommittees. The list is not session scoped: it describes the committees that exist
now. Who sits on them is session scoped; see get_committee. Use a
committee's |
| get_committeeA | A committee's roster for a session: each member's role, party, and district.
|
| get_committee_staffA | The clerks and staff who serve a committee.
|
| list_meetingsA | Meetings on the master schedule in a date range: committees, floor, caucuses. Dates are |
| list_docketsA | A Senate committee's dockets for a session: each meeting and the bills on it. Dockets are the Senate's committee agendas, newest first as LIS lists
them. The House keeps none in the API: read a House bill's committee from
get_bill_history and the committee's meetings from list_meetings.
|
| list_floor_calendarsA | A chamber's floor calendars for a session, one per sitting. A floor calendar is the day's order of business: the bills up for a
reading or a vote. Pass a |
| get_floor_calendarA | One floor calendar: the bills up for action, by section, with the votes taken.
|
| list_minutes_booksA | The published minutes books of a session, newest first. A minutes book is the clerk's record of what one body did on one day.
Both chambers publish committee books. Only the Senate publishes floor
books ( |
| get_minutes_bookA | One minutes book: each action a chamber or committee took that day, in order. One record per action, with the bill, the |
| list_communicationsA | The messages the two chambers sent each other in a session, newest first. A communication is the formal notice a clerk sends the other chamber:
"The House of Delegates has passed the following Senate bills".
|
| get_communicationA | One communication between the chambers: each statement and the bills it names.
|
| get_session_statisticsA | LIS's own bill counts for a session, by chamber of origin and legislation type. One row per chamber and |
| get_committee_statisticsA | LIS's own referral counts for each standing committee of one chamber.
|
| check_api_keyA | Validate the configured LIS API key. LIS heartbeat endpoints accept any key, so this is the only real check: it asks the PartnerAuthentication service whether the key is registered and active. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 38 tools
The set has several potentially overlapping clusters (list_bills vs search_bills; get_bill_votes vs get_bill_vote_tallies vs list_votes vs get_member_votes vs get_roll_call), but descriptions explicitly draw the boundaries (e.g. tallies is 'lighter and knows less', list_bills only matches number/description while search_bills is full text). A careful agent can select correctly, though the five-tool vote surface requires reading closely. No tool appears to do the same thing as another.
Everything is snake_case with a predictable verb_noun pattern (get_bill, list_sessions, search_bills, check_api_key), and the get_/list_ split maps cleanly to single-record vs collection. Minor variants like list_most_viewed_bills or get_bill_vote_tallies are still readable and on-pattern. No mixed casing or vague verbs.
38 tools is heavy and well above the comfortable 3-15 band, so discovery cost is real, but the domain (sessions, bills, members, committees, meetings, dockets, calendars, minutes, communications, votes) is genuinely broad and most tools map to a distinct resource or operation. It sits at the borderline of justified breadth rather than bloat.
Coverage spans the full legislative lifecycle: sessions, bills, versions, text, history, votes and roll calls, patrons, members, offices, committees and staff, meetings, dockets, floor calendars, minutes books, and inter-chamber communications, plus aggregate statistics. The read-only surface has no obvious dead ends for the domain, and cross-tool chaining (e.g. vote_id, member_id, committee number) is consistently documented.