Connect an AI assistant
Ask Claude, Codex, or any MCP-compatible assistant about legislation, and have it answer from the record instead of from memory.
What this is
Conservative States runs a Model Context Protocol server. Connecting it gives your AI assistant nineteen read-only tools over the legislative corpus: bills and their full text, amendments, roll calls, legislators, committees, the hearing calendar, what a bill changes about current law, voting-record comparisons, and session-wide aggregates. Coverage is Tennessee today.
Every answer is grounded in a query against the same database the app uses, and results carry citations that link back to the bill. The assistant is not recalling a bill — it is reading one.
Before you start
- You need a Conservative States organization account. External AI access is an organization feature; individual subscriber accounts cannot connect yet.
- An owner has to switch on Settings → MCP connections → External AI access. Doing so does not grant anyone access — it lets each person set up their own.
- Your role needs permission to use it. Owners and editors do; analysts and viewers do not.
The server address is the same for everyone:
https://mcp.conservativestates.app/mcpTwo ways to connect
This trips people up, so it is worth being blunt: these are alternatives, not steps. Do one or the other, and which one you can use depends on your tool, not on your preference.
Sign in from the app
You paste a URL, the app opens a sign-in page, you approve. No credential ever touches your clipboard.
Only this way can reach your organization’s tracked bills and positions.
Paste a token
You create a token in settings and configure your tool to send it. For anything that cannot open a browser.
Public legislative data only — never your organization’s own positions.
The reason for that split: a stance on a bill is the most strategically sensitive thing in the product. A pasted token can sit in a config file for months; a signed-in connection has consent, ten-minute credentials, and a revoke button.
Claude (claude.ai and the desktop app)
- 1Open Settings → Connectors.
- 2Choose Add custom connector.
- 3Paste
https://mcp.conservativestates.app/mcpas the server URL. - 4Approve the sign-in screen that opens. That is the whole flow — there is no token to enter.
Start a new conversation and ask something like “what moved in the legislature this week?” The assistant will call the tools on its own.
Claude Code
Add the server, then authenticate from inside the session:
claude mcp add --transport http conservative-states https://mcp.conservativestates.app/mcpRun /mcp and pick the server to sign in. Alternatively, if you would rather use a token, create one in settings and pass it as a header instead — no browser step:
claude mcp add --transport http conservative-states https://mcp.conservativestates.app/mcp \
--header "Authorization: Bearer cs_mcp_…"Codex
Codex takes the token from an environment variable rather than the config file, which is the right way round:
export CS_MCP_TOKEN=cs_mcp_…
codex mcp add conservative_states --url https://mcp.conservativestates.app/mcp \
--bearer-token-env-var CS_MCP_TOKENOpenAI Responses API
Add it as a hosted MCP tool:
{
"type": "mcp",
"server_label": "conservative_states",
"server_url": "https://mcp.conservativestates.app/mcp",
"authorization": "cs_mcp_…",
"require_approval": "never"
}MCP Inspector
Useful for looking at the raw tool list and calling one by hand:
npx @modelcontextprotocol/inspector --cli https://mcp.conservativestates.app/mcp \
--transport http --header "Authorization: Bearer cs_mcp_…" \
--method tools/listOther clients
Any client speaking MCP over Streamable HTTP should work. The server implements the 2026-07-28 revision and also serves the 2025 revision that most shipping clients still use, with OAuth 2.1 discovery via /.well-known/oauth-protected-resource.
The five above are the ones we have actually tested end to end. ChatGPT’s in-product connectors and the Anthropic Messages API connector are untested — they may well work, but we would rather say so than imply a guarantee we have not earned.
What you can ask for
| Tool | What it returns | Cost |
|---|---|---|
search_bills | Find 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. | standard |
semantic_search_legislation | Searches 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. | expensive |
get_bill | Full 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. | standard |
get_bill_text | The actual text, by section and page. Use it when the exact wording matters — quoting a provision, checking what a section says, reading an amendment. | standard |
get_bill_changes | Amendments filed against a bill, what each does, and whether it was adopted, withdrawn, or is still pending. | standard |
get_bill_statute_changes | What 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. | standard |
compare_bills | Two to five bills aligned side by side — provisions, statutes touched, status, scores — plus which are companions and how textually similar they are. | standard |
get_similar_bills | Bills whose text and policy resemble a given bill, ranked, with companions labelled. | standard |
get_votes | Totals 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. | standard |
get_legislator | A 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. | standard |
get_legislator_dissents | The 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. | expensive |
get_vote_alignment | How 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. | expensive |
get_committee | Membership 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. | standard |
get_policy_framework | The 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. | cheap |
get_recent_legislative_activity | Bills filed, actions taken, votes recorded, amendments filed, hearings scheduled. The starting point for "what changed this week", rather than searching text. | standard |
get_legislative_calendar | What 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. | standard |
aggregate_legislative_data | Counts, 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. | expensive |
get_org_portfolio | Your organization’s own tracked bills, issue portfolios, and positions — what you support, what you oppose, and how much you care. | cheap |
get_org_legislator_intel | What 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. | standard |
You do not call these by name. Ask a question in ordinary language and the assistant picks; the names matter only when something goes wrong and you want to know what it did.
The full reference covers each tool’s arguments and sharp edges, with worked examples of the chains that answer real questions — and is available as a PDF to hand to a colleague.
How results come back
- Citations. Results carry stable identifiers and links back to each bill, so an assistant can show its work.
- Freshness and completeness. Every response says whether it was cut short, and whether any derived analysis is still being generated — so a partial answer cannot be narrated as a complete one.
- Paging. Long lists return a cursor. The assistant passes it back to continue; cursors are tied to the exact query and expire after an hour.
Limits
Per connection, per minute:
- 120 cheap calls
- 90 standard calls
- 20 expensive calls — full-text search and session-wide aggregates
- 150 calls total, whatever the mix
Generous by design: a single research question legitimately makes a dozen calls. If you hit a limit, the assistant is told to wait rather than being cut off.
The same ceilings apply above a connection — 300 calls a minute per account and 900 per organization, of which 60 may be expensive. Connecting a second client does not buy a second budget, which is what keeps one busy organization from slowing the service for everyone else.
A connection can also have 4 calls running at once. An assistant issuing a burst in parallel simply queues; it is not refused.
Privacy and control
- Your questions are not stored. We log which tool ran, how long it took, and how much came back — never the arguments. What you ask a bill about can itself reveal strategy, so it is kept out of the log by construction.
- A connection sees exactly what you see. Permissions are resolved fresh on every request, so a role change takes effect within the minute — access does not linger in an old credential.
- Revocation is immediate. Revoke from Settings → MCP connections and the next request fails. There is no cache to wait out.
- An owner can switch the whole thing off for the organization at any time, which pauses every connection at once without destroying them.
When something goes wrong
The app says it cannot authenticate, or every request fails with 401.
The connection was revoked, the token expired, or the organization switched external AI access off. Check Settings → MCP connections.
Connecting is refused with 403.
Your role does not include permission to use external AI, or the organization has not switched it on. An owner can do both.
The assistant cannot see your organization's tracked bills.
You are connected with a pasted token. Only a signed-in connection can reach positions — reconnect using the server URL and approve the sign-in screen.
Every request fails with 400, from one network but not another.
Something between you and us is stripping the protocol headers the specification requires — usually a corporate proxy. Try a different network to confirm before digging.
Changes
- August 2026 — Six new tools.
get_vote_alignmentcompares voting records — two members, a whole caucus ranked against one, or every member ranked against your own recorded positions.get_legislative_calendaranswers “what is scheduled next week” across every bill at once.get_bill_statute_changesshows what a bill changes about current law, which amendatory drafting cannot tell you.get_org_legislator_intelgathers your own notes, supporter counts, and voting record for one member.aggregate_legislative_datagained pass and fail rates by referring committee — where your bills actually die. - August 2026 — Agreement rates now separate contested roll calls from all of them. Four in five votes pass unanimously, so a raw agreement figure made members who oppose each other on everything contested look like allies. Both figures are returned; rankings sort on the contested one.
- August 2026 — An empty answer now 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 all used to look identical.
- August 2026 —
search_billsnow actually applies itsstatusesfilter, which had been accepted and ignored, and bill status is correct throughout. Responses also report how current the data is and whether anything is still processing. If you passedstatusesbefore, your result sets will shrink — they were never filtered. - August 2026 — Rate limits now apply per account and per organization as well as per connection, so a second connection no longer buys a second budget.
- August 2026 —
get_policy_framework: the position framework this organization analyzes legislation against, across 13 policy domains. The bill tools are descriptive by design and carry no position, so an assistant judging whether something is conservative was previously using its own idea of the word.search_billsalso gained a government-scope filter and now returns the controversy and fiscal-direction signals. - August 2026 —
get_legislator_dissents: the roll calls behind a member’s party-break count, with what their own party and the other party voted on each. Break rates no longer count missed votes — Not Voting and Absent are reported separately, and were previously inflating members who simply miss votes. - August 2026 — Public launch. Sign-in and token connections, cursor paging on long lists, usage visible in settings.
