Skip to main content
Glama
sh-patterson

LegiScan MCP Server

by sh-patterson

LegiScan MCP 服务器

CI License: MIT Node TypeScript

一个模型上下文协议 (MCP) 服务器,为终端代理提供对 LegiScan API 的结构化访问,以获取美国所有 50 个州和国会的立法数据。

专为研究工作流构建,您可以指导代理(Codex、Claude Code、Claude Desktop 等)快速收集法案历史、提案人背景和投票记录。

功能

  • 10 个精简的 MCP 工具,针对立法研究工作流进行了优化

  • 复合工具,将多步研究工作流简化为单次 MCP 工具调用

  • 针对重复法案和点名投票查询的请求级批处理和查找缓存

  • 所有 API 响应的完整 TypeScript 类型定义

  • 法案编号标准化(处理 AB 858、AB858、AB-858 格式)

  • 针对州代码、立法者姓名查询和大型法案批次的输入验证护栏

Related MCP server: Gavelin

安装

从 npm 安装(推荐)

npm install -g legiscan-mcp-server

从源码安装

git clone https://github.com/sh-patterson/legiscan-mcp.git
cd legiscan-mcp
npm install
npm run build

设置

1. 获取 LegiScan API 密钥

  1. LegiScan 注册免费账户

  2. https://legiscan.com/legiscan 注册 API 访问权限

  3. 复制您的 API 密钥

2. 添加到支持 MCP 的代理中

将此服务器添加到您的终端代理所使用的任何 MCP 主机中。

Claude Desktop 配置文件路径:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

对于其他 MCP 客户端(Codex CLI、Claude Code 等),请在相应客户端的 MCP 配置文件中添加相同的 mcpServers.legiscan 条目。

使用 npx(推荐)

{
  "mcpServers": {
    "legiscan": {
      "command": "npx",
      "args": ["-y", "legiscan-mcp-server"],
      "env": {
        "LEGISCAN_API_KEY": "your_api_key_here"
      }
    }
  }
}

使用本地安装

{
  "mcpServers": {
    "legiscan": {
      "command": "node",
      "args": ["/path/to/legiscan-mcp-server/dist/index.js"],
      "env": {
        "LEGISCAN_API_KEY": "your_api_key_here"
      }
    }
  }
}

可用工具

复合工具(高阶研究)

工具

描述

legiscan_find_legislator

通过姓名查找立法者的 people_id。支持部分匹配。

legiscan_get_legislator_votes

在一次调用中获取立法者对多个法案的投票情况。

legiscan_get_primary_authored

仅获取立法者作为主要提案人(而非共同提案人)的法案。

法案

工具

描述

legiscan_get_bill

获取详细的法案信息(提案人、历史、投票、文本)

legiscan_find_bill_by_number

按编号查找法案(处理 AB 858、AB858、AB-858、A.B. 858)。最适合精确法案查找。

legiscan_get_roll_call

获取包含个人立法者投票详情的投票记录

人员

工具

描述

legiscan_get_person

获取包含第三方 ID(VoteSmart、OpenSecrets 等)的立法者信息

legiscan_get_session_people

获取某次会议中所有活跃的立法者

搜索

工具

描述

legiscan_search

对立法进行全文搜索。接受如 AB858 等法案编号变体,但对于精确匹配,请使用 legiscan_find_bill_by_number

会议

工具

描述

legiscan_get_session_list

按州列出可用的立法会议

研究工作流(终端代理)

1. 从范围明确的请求开始

为您的代理提供目标、州、时间范围和输出格式。

示例提示词:

Use the LegiScan MCP tools to find major California housing bills in the current session.
Return: bill number, title, latest action date, top sponsors, and whether there was a close roll-call vote (margin <= 5).

2. 让代理遵循工具序列

为了获得高质量结果,请指示代理按此顺序操作:

  1. legiscan_get_session_list 以确定正确的会议。

  2. legiscan_searchlegiscan_find_bill_by_number 以定位目标法案。

  3. legiscan_get_bill 以获取提案人/历史/投票参考。

  4. legiscan_get_roll_call 以获取个人投票详情。

  5. legiscan_get_person 仅在需要补充立法者信息时使用。

如果您从 legiscan_find_legislator 开始,请继续在后续的提案工作流中传递返回的 session.session_id 或相同的 state,以便结果保持在预期的立法机构和时间范围内。

3. 为分析师工作流重用复合工具

这些工具减少了工具调用量并简化了对代理的指令:

  • legiscan_find_legislator:从姓名查询中获取 people_id

  • legiscan_get_primary_authored:将主要提案法案与共同提案法案分开。

  • legiscan_get_legislator_votes:在一次请求中拉取多个法案的投票立场。

提示词模板

A) 针对某位立法者的反对派研究

Use LegiScan MCP for Texas.
1) Find legislator "Jane Smith".
2) List all primary-authored bills in the current session.
3) For these bills, summarize topic area and latest status.
4) Then check votes on SB 12, HB 301, and SB 455, and show how the legislator voted.

B) 针对特定议题的法案追踪简报

Use LegiScan MCP to track "climate resilience" bills in New York.
Focus on current session only.
Return top 15 bills by relevance with bill number, title, last action, sponsor party, and any recorded roll calls.

C) 记分卡支持工作流

For California session 2172, resolve bill numbers AB 858, SB 525, SB 616, SB 399.
For each bill, fetch details and any roll calls.
Then report vote positions for people_id values 21719, 23214, and 25359.
Output as a table suitable for CSV export.

工作流简化

复合工具显著减少了常见工作流中代理与工具之间的往返次数:

工作流

手动 MCP 步骤

使用复合工具

获取 1 位立法者对 10 项法案的投票

查找立法者 → 搜索/解析法案 → 检查每项法案 → 检查每次点名投票

一旦拥有 bill_ids,只需 1 次工具调用

从 150 项提案法案中筛选主要提案

提案列表 → 获取每项法案 → 检查提案人

1 次工具调用,可选按 statesession_id 范围限定

按姓名查找立法者

会议发现 → 会议人员查找 → 手动匹配

1 次工具调用

研究技巧

  • 州代码被验证为双字母字符串并自动转换为大写(caCA)。无效代码(如 ZZ)可以通过本地验证,但会从 LegiScan 返回 API 错误。

  • 请务必在提示词中固定州和会议,以减少歧义结果。

  • 要求代理在中间输出中显示 bill_idroll_call_idpeople_id,以便您可以审计可追溯性。

  • 对于立法者搜索,请至少提供名字和姓氏(姓名输入必须至少为 2 个字符)。

  • legiscan_get_primary_authored 可以返回所有可用会议,但传递 statesession_id 可以使结果与预期的立法机构和时间范围保持一致。

  • legiscan_get_legislator_votes 每个请求最多接受 100 个 bill_ids;请将较大的任务拆分为多个块。

  • legiscan_search 会使用规范的空格格式重试紧凑的法案编号查询(如 AB858)。对于精确的法案解析,请优先使用 legiscan_find_bill_by_number

  • 如果您计划进行后续分析,请要求以表格/CSV 格式输出最终结果。

开发

npm run build        # Compile TypeScript
npm run typecheck    # Type-check src + tests
npm test             # Run deterministic unit tests (no API key)
npm run test:e2e     # Run real-world workflow tests (skips cleanly without API key)
npm run test:live    # Run live API integration tests (requires API key)
npm run test:coverage # Run unit tests with coverage
npm run lint         # Check for lint errors
npm run format       # Format code with Prettier

测试模式

  • npm test / npm run test:unit:使用模拟网络调用的快速确定性测试。

  • npm run test:e2e:基于真实立法分析任务的研究工作流测试。如果 LEGISCAN_API_KEY 不可用,则跳过。

  • npm run test:live:真实的 LegiScan API 集成测试。需要 LEGISCAN_API_KEY

API 限制

  • 免费公共 API 密钥每月有 30,000 次查询 的限制

  • 复合工具会批处理请求(最多 10 个并发)并在单个请求内缓存重复查找,以避免不必要的重复

  • 复合工具减少了 MCP 工作流的摩擦,但 LegiScan API 的使用量仍会随着您检查的不同法案和点名投票的数量而增加

Docker

在本地构建容器镜像:

docker build -t legiscan-mcp .

在运行时提供您的 API 密钥并运行它:

docker run --rm -i \
  -e LEGISCAN_API_KEY=your-api-key-here \
  legiscan-mcp

发布

Glama 检查需要 GitHub 发布。合并下一次仓库更改后,从 GitHub 创建并发布标签(例如 v1.0.0),或使用以下命令:

git tag v1.0.0
git push origin v1.0.0

Docker

在本地构建容器镜像:

docker build -t legiscan-mcp .

在运行时提供您的 API 密钥并运行它:

docker run --rm -i \
  -e LEGISCAN_API_KEY=your-api-key-here \
  legiscan-mcp

发布

Glama 检查需要 GitHub 发布。推送更改后,创建并发布标签(例如 v1.0.0)。

许可证

MIT - 详情请参阅 LICENSE

Available Tools

10 tools
legiscan_find_bill_by_numberA

Find a bill by its number within a state's current session or specific session. Handles format variations (AB 858, AB858, AB-858). Returns bill summary if found, null if not.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTwo-letter state abbreviation (e.g., CA, TX). Uses current session.
session_idNoSession ID for searching a specific session. Takes precedence over state.
bill_numberYesBill number in any common format (e.g., 'AB 858', 'AB858', 'AB-858', 'SB 1234')

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must carry behavioral info. It states return behavior (bill summary or null) and format handling, but does not explicitly declare read-only nature or discuss side effects, permissions, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundant information. Efficiently communicates purpose, usage options, and handling behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers input variations and precedence, and mentions return type. Missing output schema, but description adequately addresses what to expect. Could mention that bill summary includes key fields, but not necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and description adds value beyond schema: examples for state (CA, TX), precedence rule for session_id, and common bill number formats (AB 858, AB858, etc.).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states action (find), resource (bill), and context (by number within session). Distinguishes from siblings like legiscan_get_bill (which likely uses ID) and legiscan_search (general search).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains state vs session_id options and format variations, but does not explicitly mention when to use this versus alternative tools (e.g., legiscan_get_bill) or provide exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_find_legislatorA

Find a legislator's people_id by searching their name. Useful as a first step before other queries. Supports partial name matching.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull or partial name to search (e.g., 'Smith', 'Jane Smith')
stateYesTwo-letter state abbreviation (e.g., 'CA')
session_idNoOptional specific session_id (default: current session)

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. States 'Supports partial name matching', a key behavioral trait. Lacks details on error handling, rate limits, or multiple results, but sufficient for a simple lookup.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two brief sentences, front-loaded with the core action. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explicitly mentions the return value (people_id). With full parameter schema and no nested objects, the description provides enough context to understand the tool's role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds 'partial name matching' which overlaps with schema's 'Full or partial name'. No additional detail on session_id or beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'find', the resource 'legislator's people_id', and the method 'searching their name'. Distinguishes from siblings by framing it as a 'first step before other queries', implying it is a lookup tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Useful as a first step before other queries', providing clear context. Does not explicitly state when not to use, but the purpose is well-defined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_get_billA

Get detailed bill information including sponsors, full history, votes, texts, amendments, and supplements. This is the primary tool for bill research.

ParametersJSON Schema
NameRequiredDescriptionDefault
bill_idYesBill ID from search results or find_bill_by_number

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden of behavioral disclosure. It describes the information returned (sponsors, history, votes, etc.), which implies a read-only operation, but it does not explicitly state idempotency, potential side effects, authentication requirements, or rate limits. The description is adequate but not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of just two sentences. The first sentence lists the key components of the bill information, and the second sentence asserts its role as the primary research tool. Every word is purposeful, and there is no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (one required parameter, no output schema, no annotations), the description sufficiently covers what the tool does and what it returns. It could mention limitations like jurisdiction scope or required API key, but for a basic retrieval tool, the description provides adequate context for an AI agent to understand its purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter (bill_id) with 100% description coverage. The schema's description already explains its source ('from search results or find_bill_by_number'). The tool's description adds no additional parameter information beyond the schema, so it provides no extra value for parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the verb 'Get' and the resource 'detailed bill information', listing key components like sponsors, history, votes, etc. It also explicitly identifies itself as 'the primary tool for bill research', distinguishing it from sibling tools like legiscan_search or legiscan_find_bill_by_number.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this is the primary tool for bill research, implying its use for comprehensive data. However, it does not explicitly state when to avoid it or specify alternatives for simpler needs (e.g., legiscan_find_bill_by_number for just an ID). The guidance is clear but lacks exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_get_legislator_votesA

Get how a legislator voted on specific bills. Use find_legislator first to get people_id from a name. Returns vote positions (Yea/Nay/NV/Absent) for each bill with roll call details.

ParametersJSON Schema
NameRequiredDescriptionDefault
chamberNoOptional chamber filter (H=House, S=Senate, A=Assembly)
bill_idsYesArray of bill_ids to check votes on (max 100)
people_idYesLegislator ID (use find_legislator to resolve from name)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It states the return format (vote positions with roll call details) but does not explicitly confirm read-only behavior, permissions, or side effects. The description is adequate but minimally informative beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main action. Every sentence serves a purpose: stating the function and providing usage guidance. No extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains return values (vote positions). It covers the prerequisite tool and parameter roles. Missing: error conditions, edge cases (e.g., invalid bill_ids), but overall sufficient for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds context for people_id (use find_legislator) but otherwise repeats schema information (chamber enum, bill_ids array). No new semantic meaning beyond structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get how a legislator voted on specific bills' with a specific verb and resource. It distinguishes from siblings like get_roll_call (single roll call) and get_bill (bill details) by focusing on legislator votes. The prerequisite to use find_legislator is explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance to use find_legislator first to obtain people_id. However, it does not mention when not to use this tool or alternative tools for different scenarios (e.g., single roll call). The usage context is clear but lacks exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_get_personA

Get legislator information including party, role, district, and third-party IDs (VoteSmart, OpenSecrets, Ballotpedia, FollowTheMoney).

ParametersJSON Schema
NameRequiredDescriptionDefault
people_idYesLegislator ID (use find_legislator to resolve from name)

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavioral traits. It does not explicitly state that the operation is read-only, nor does it mention response characteristics, error conditions, or rate limits. A simple 'get' is safe, but transparency is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence of 20 words efficiently conveys the tool's purpose and key return fields. No redundant information, and the most important content is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema, the description provides a reasonable list of return fields. It does not cover error responses or rate limits, but the core functionality is adequately described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter description includes a helpful hint to use find_legislator. The main description adds meaning by enumerating the data fields returned (party, role, district, IDs), which goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves legislator information and lists specific fields (party, role, district, third-party IDs). It distinguishes from siblings like legiscan_find_legislator by implying a workflow (people_id from find_legislator), though not explicitly in the main description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parameter description hints that find_legislator should be used first to obtain the people_id, but there is no explicit guidance on when to use this tool versus siblings or when not to use it. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_get_primary_authoredA

Get only bills where a legislator is the PRIMARY author, not co-sponsor. Use find_legislator first to get people_id from a name. Filters out co-sponsored bills automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoOptional state abbreviation - if provided without session_id, uses current session
people_idYesLegislator ID (use find_legislator to resolve from name)
session_idNoOptional session_id to filter results

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses automatic filtering of co-sponsored bills, but does not mention permissions, rate limits, or error behavior. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. Front-loaded with purpose, followed by usage guidance. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but tool is simple. Description covers filtering behavior and prerequisite step. Missing return value details, but acceptable for a retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions. Description adds value for people_id by explaining how to resolve it via find_legislator, beyond schema. No additional info for state or session_id, but reasonable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Get' and resource 'bills where a legislator is the PRIMARY author, not co-sponsor'. Distinguishes from co-sponsor and mentions prerequisite use of find_legislator. No ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use find_legislator first to obtain people_id, providing a clear prerequisite. States that co-sponsored bills are filtered out automatically, implying when to use. Lacks explicit when-not-to-use, but context is clear given sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_get_roll_callA

Get roll call vote details including individual legislator votes. Get roll_call_id by calling get_bill first.

ParametersJSON Schema
NameRequiredDescriptionDefault
roll_call_idYesRoll call ID from get_bill response

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The verb 'Get' implies a read-only operation, and it describes the return content (roll call details, individual votes). No annotations are provided, so the description adequately covers behavior for a simple retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: first for purpose, second for usage guidance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description provides necessary context: how to get the ID and what the response contains. It could mention error handling or rate limits, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description repeats the same context as the schema parameter description. It adds no new semantics beyond what is already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it retrieves roll call vote details including individual legislator votes. Distinguishes from sibling tools like get_bill which provides the roll_call_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to obtain roll_call_id from get_bill first, providing a clear prerequisite. Does not mention when not to use it or alternatives, but the workflow guidance is helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_get_session_listA

Get list of available legislative sessions. Returns sessions with session_id, years, and state info. Use session_id for subsequent bill lookups.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTwo-letter state abbreviation (e.g., 'CA', 'TX'). Omit to get sessions for all states.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that the tool returns a list of sessions with specific fields, implying a read-only operation. Minor omission: no explicit statement about safety or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the main purpose, no extraneous information. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and no output schema, the description is complete: it states what is returned and how to use the results. No additional details are necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already describes the parameter (state abbreviation, optional). The description adds no additional semantic value beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a list of legislative sessions and specifies the returned fields (session_id, years, state info). It differentiates from sibling tools which focus on bills, legislators, or roll calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: use this tool to obtain session IDs for subsequent bill lookups. It implies when to use, but does not explicitly exclude cases where session IDs are already known.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legiscan_get_session_peopleA

Get all legislators active in a legislative session. Returns list of people with their roles, parties, and districts.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession ID (use get_session_list to find sessions for a state)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It states the return content (list with roles, parties, districts) but does not disclose if it is read-only, any rate limits, or pagination behavior. For a simple getter, this is adequate but could be improved by explicitly stating 'Read-only operation, no side effects'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two short sentences. No unnecessary words. It efficiently communicates the tool's purpose and output, earning its place without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has a single parameter and no output schema, the description provides sufficient information to understand what the tool does and what it returns. It could optionally mention that the list includes identifiers (e.g., person_id) for further operations, but it is complete enough for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with one parameter (session_id) already described in the schema. The description adds value by explaining how to obtain the session_id ('use get_session_list to find sessions for a state'), which goes beyond the schema's basic type and requirement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' and clearly identifies the resource as 'all legislators active in a legislative session'. It also states what is returned (list with roles, parties, districts), which distinguishes it from siblings like legiscan_get_person (single person) or legiscan_find_legislator (search by criteria).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you need legislators in a session but does not explicitly state when to use this tool versus alternatives (e.g., use legiscan_find_legislator if you know the legislator name). The context is clear but lacks exclusions or direct comparisons to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updates
    • Changedlegiscan_find_bill_by_number1 field changed
      • addedInput schema / properties / state / pattern
        Added value: +"^[A-Za-z]{2}$"
    • Changedlegiscan_find_legislator2 fields changed
      • addedInput schema / properties / name / minLength
        Added value: +2
      • addedInput schema / properties / state / pattern
        Added value: +"^[A-Za-z]{2}$"
    • Changedlegiscan_get_legislator_votes4 fields changed
      • changedInput schema / properties / bill_ids / description
        Previous value: -"Array of bill_ids to check votes on"New value: +"Array of bill_ids to check votes on (max 100)"
      • addedInput schema / properties / bill_ids / maxItems
        Added value: +100
      • addedInput schema / properties / bill_ids / minItems
        Added value: +1
      • changedInput schema / properties / people_id / description
        Previous value: -"Legislator people_id to look up votes for"New value: +"Legislator ID (use find_legislator to resolve from name)"
    • Changedlegiscan_get_person1 field changed
      • changedInput schema / properties / people_id / description
        Previous value: -"People ID from sponsors, votes, or session people lists"New value: +"Legislator ID (use find_legislator to resolve from name)"
    • Changedlegiscan_get_primary_authored2 fields changed
      • changedInput schema / properties / people_id / description
        Previous value: -"Legislator people_id to get primary authored bills for"New value: +"Legislator ID (use find_legislator to resolve from name)"
      • addedInput schema / properties / state / pattern
        Added value: +"^[A-Za-z]{2}$"
    • Changedlegiscan_get_roll_call1 field changed
      • changedInput schema / properties / roll_call_id / description
        Previous value: -"Roll call ID from bill.votes[] array"New value: +"Roll call ID from get_bill response"
    • Changedlegiscan_get_session_list1 field changed
      • addedInput schema / properties / state / pattern
        Added value: +"^[A-Za-z]{2}$"
    • Changedlegiscan_get_session_people1 field changed
      • changedInput schema / properties / session_id / description
        Previous value: -"Session ID from getSessionList"New value: +"Session ID (use get_session_list to find sessions for a state)"
    • Changedlegiscan_search1 field changed
      • addedInput schema / properties / state / pattern
        Added value: +"^(?:[A-Za-z]{2}|[Aa][Ll][Ll])$"
  2. 10 tool updatesv1.0.0
    • First observedlegiscan_find_bill_by_number
    • First observedlegiscan_find_legislator
    • First observedlegiscan_get_bill
    • First observedlegiscan_get_legislator_votes
    • First observedlegiscan_get_person
    • First observedlegiscan_get_primary_authored
    • First observedlegiscan_get_roll_call
    • First observedlegiscan_get_session_list
    • First observedlegiscan_get_session_people
    • First observedlegiscan_search

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct resource or action (bills, legislators, sessions, votes, search) with clear boundaries. Even related tools like get_legislator_votes and get_roll_call serve different purposes (individual legislator vs. specific roll call).

Naming Consistency5/5

All tool names follow a consistent 'legiscan_verb_noun' pattern using lowercase with underscores. Verbs are limited to 'find', 'get', and 'search', making the set predictable.

Tool Count5/5

10 tools is well-scoped for a legislative tracking server. Each tool addresses a core need without unnecessary duplication or omission.

Completeness5/5

The tool surface covers the primary lifecycle for legislative data: discovering sessions, searching bills, retrieving details, and accessing legislator info and votes. No obvious gaps for a read-only MCP server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables access to comprehensive U.S. legislative and governmental data from GovInfo.gov and Congress.gov APIs, including bills, Congressional records, Federal Register documents, member information, and committee activities.
    1
    -
  • A
    license
    A
    quality
    D
    maintenance
    Provides tools to search and retrieve US federal and state legislative data, including bills, votes, campaign contributions, and legislator information, with provenance tracking.
    8
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Access U.S. state legislative data including bills, legislators, and votes across all 50 states via the OpenStates API.
    5 npm
    MIT