fec-mcp-server
FEC MCP 服务器
一个用于联邦选举委员会 (FEC) 竞选财务研究和透明度的模型上下文协议 (MCP) 服务器。该服务器提供用于搜索候选人、检索财务报告以及分析官方 FEC 数据中的捐款和支出的工具。
功能
search_candidates: 按姓名搜索联邦候选人,可按选举年份、职位、州或党派进行筛选
get_committee_finances: 检索财务摘要,包括收入、支出、手头现金和消耗率
get_receipts: 获取包含捐赠者详细信息的逐项捐款(附表 A)
get_disbursements: 获取包含收款人和用途详细信息的逐项支出(附表 B)
Flagged-first notable analysis: 可选的显著性区块,用于显示带有参考列表和启发式标记原因的捐款/支出
get_independent_expenditures: 追踪超级政治行动委员会 (Super PAC) 支持或反对候选人的支出(附表 E)
get_committee_flags: 检查 RFAI(补充信息请求)、修正案及相关合规性红旗警告
search_donors: 在所有委员会中按姓名、雇主或职业搜索个人捐赠者
search_spending: 在所有委员会中按描述或收款人搜索竞选支出
所有数据均直接来自官方 OpenFEC API。
Related MCP server: @cyanheads/openfec-mcp-server
安装
先决条件
Node.js 20 或更高版本
FEC API 密钥(可从 api.open.fec.gov 免费获取)
从 npm 安装
npm install -g fec-mcp-server从源码安装
git clone <repository-url>
cd fecmcp
npm install
npm run build配置
将您的 FEC API 密钥设置为环境变量:
export FEC_API_KEY=your-api-key-here或者在项目根目录创建一个 .env 文件:
FEC_API_KEY=your-api-key-here与 Claude Desktop 一起使用
将服务器添加到您的 Claude Desktop 配置文件中:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"fec": {
"command": "npx",
"args": ["fec-mcp-server"],
"env": {
"FEC_API_KEY": "your-api-key-here"
}
}
}
}或者如果已全局安装:
{
"mcpServers": {
"fec": {
"command": "fec-mcp-server",
"env": {
"FEC_API_KEY": "your-api-key-here"
}
}
}
}工具
search_candidates
按姓名搜索 FEC 候选人记录。
参数:
q(必填): 要搜索的候选人姓名election_year(可选): 按选举年份筛选(例如 2024)office(可选): 按职位筛选 - H(众议院)、S(参议院)、P(总统)state(可选): 按州筛选(2 位字母代码)party(可选): 按党派代码筛选(例如 "DEM", "REP")
示例:
Search for candidates named "Smith" running for Senate in 2024get_committee_finances
检索竞选委员会的财务摘要。
参数:
committee_id(必填): FEC 委员会 ID(例如 "C00401224")cycle(可选): 两年选举周期(例如 2024)
返回:
总收入和总支出
手头现金
欠债
消耗率(支出/收入比率)
捐款明细(个人、PAC、党派)
小额捐赠者百分比
示例:
Get the financial summary for committee C00401224get_receipts
检索委员会收到的逐项捐款(附表 A)。
参数:
committee_id(必填): FEC 委员会 IDmin_amount(可选): 最低捐款金额(默认:$1,000)two_year_transaction_period(可选): 选举周期(例如 2024)cycle(可选):two_year_transaction_period的别名;自动将捐款与财务周期使用对齐contributor_type(可选): "individual" 或 "committee"include_notable(可选): 包含标记优先的显著性区块(默认:true)fuzzy_threshold(可选): 参考列表标记的模糊匹配阈值(默认:90,范围:80-99)limit(可选): 结果数量(默认:20,最大:100)sort_by(可选): "amount" 或 "date"(默认:"amount")
示例:
Show the top 10 contributions over $5,000 to committee C00401224get_disbursements
检索委员会进行的逐项支出(附表 B)。
参数:
committee_id(必填): FEC 委员会 IDmin_amount(可选): 最低支出金额(默认:$1,000)two_year_transaction_period(可选): 选举周期cycle(可选):two_year_transaction_period的别名;自动将支出与财务周期使用对齐purpose(可选): 按用途关键词筛选(例如 "MEDIA", "CONSULTING")include_notable(可选): 包含标记优先的显著性区块(默认:true)fuzzy_threshold(可选): 参考列表标记的模糊匹配阈值(默认:90,范围:80-99)limit(可选): 结果数量(默认:20,最大:100)sort_by(可选): "amount" 或 "date"(默认:"amount")
示例:
Show media-related spending over $10,000 by committee C00401224get_independent_expenditures
检索独立支出(附表 E)——即 PAC 和超级 PAC 为支持或反对候选人而花费的资金。
参数:
candidate_id(可选): FEC 候选人 ID,用于查看针对他们的支出committee_id(可选): FEC 委员会 ID,用于查看他们的独立支出support_oppose(可选): 按 "support"(支持)或 "oppose"(反对)筛选min_amount(可选): 最低支出金额cycle(可选): 两年选举周期limit(可选): 结果数量(默认:20)
注意:candidate_id 或 committee_id 必须提供其中之一。
示例:
Show independent expenditures opposing candidate P00009423get_committee_flags
检查竞选委员会是否存在合规性红旗警告,包括 RFAI 和修正案。
参数:
committee_id(必填): FEC 委员会 IDcycle(可选): 两年选举周期
返回:
RFAI(补充信息请求)数量和详细信息
修正案数量和详细信息
近期合规性问题
示例:
Check committee C00401224 for any compliance flagssearch_donors
按姓名、雇主或职业在所有 FEC 文件中搜索个人捐赠者。
参数:
contributor_name(可选): 要搜索的捐赠者姓名contributor_employer(可选): 雇主名称(例如 "Goldman Sachs")contributor_occupation(可选): 职业(例如 "Lobbyist")contributor_state(可选): 两位字母的州代码min_amount(可选): 最低捐款金额(默认:$200)cycle(可选): 两年选举周期limit(可选): 结果数量(默认:20)
注意:contributor_name、contributor_employer 或 contributor_occupation 至少需要提供一项。
示例:
Find contributions from employees of "Meta" in Californiasearch_spending
按描述或收款人在所有委员会中搜索竞选支出(附表 B)。
参数:
description(可选): 支出描述中的关键词(例如 "travel", "consulting")recipient_name(可选): 收款人/供应商名称recipient_state(可选): 两位字母的州代码min_amount(可选): 最低金额(默认:$500)cycle(可选): 两年选举周期limit(可选): 结果数量(默认:20)
注意:description 或 recipient_name 至少需要提供一项。
示例:
Find spending on "golf" or "resort" across all committees开发
设置
npm install运行测试
npm test # Single run
npm run test:coverage # With coverage
npm run test:e2e # Live API tests, requires FEC_API_KEY构建
npm run build类型检查
npm run typecheck实时验收检查
npm run acceptance:fec-day
npm run acceptance:notableAPI 速率限制
FEC API 允许使用 API 密钥每小时进行 1,000 次请求。如需更高的限制(每小时最多 7,200 次请求),请联系 FEC。
超时与 API 延迟
默认请求超时为 30 秒。搜索工具(search_candidates、search_donors、search_spending)使用 60 秒超时,因为这些 FEC API 端点执行广泛的数据库扫描,本质上较慢。
要全局覆盖默认超时,请设置 FEC_API_TIMEOUT_MS 环境变量:
export FEC_API_TIMEOUT_MS=45000 # 45 secondsDocker
在本地构建容器镜像:
docker build -t fec-mcp-server .在运行时提供您的 API 密钥并运行它:
docker run --rm -i \
-e FEC_API_KEY=your-api-key-here \
fec-mcp-server发布
Glama 检查需要 GitHub 发布。在合并您的下一次仓库更改后,从 GitHub 创建并发布一个标签(例如 v1.0.0),或者使用:
git tag v1.0.0
git push origin v1.0.0许可证
MIT
免责声明
此工具旨在用于竞选财务透明度研究。它以中立、无党派的方式提供对公开 FEC 数据的访问。该工具及其输出不应用于促进或反对任何候选人或政党。
资源
参考列表归属:
github/DGA-Research/FEC_Coder_Project_Streamlit(捆绑快照位于resources/reference-lists/下)
Available Tools
8 toolsget_committee_financesA
Retrieve comprehensive financial summary for a campaign committee from official FEC filings. Returns total receipts, disbursements, cash on hand, debts, loans (including candidate loans), and calculates burn rate (spending/income ratio). Includes Schedule C loans and Schedule D debts for complete financial picture. Essential for understanding campaign financial health and transparency research.
| Name | Required | Description | Default |
|---|---|---|---|
| committee_id | Yes | FEC committee ID (e.g., "C00401224") | |
| cycle | No | Two-year election cycle (e.g., 2024). Defaults to most recent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It details the returned metrics (receipts, disbursements, cash, debts, loans, burn rate) and mentions Schedule C/D inclusion. Does not disclose potential limitations like data freshness or rate limits, but is thorough for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no waste. The main action is first, followed by contents, then use case. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description explains return values clearly. Covers the main aspects of the financial summary, but missing details on error handling or pagination, which may be acceptable for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. The description adds no extra meaning beyond the schema; it restates the default for cycle which is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it retrieves a comprehensive financial summary for a campaign committee from official FEC filings. Specific verb, resource, and scope distinguish it from more specific sibling tools like get_disbursements and get_receipts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States it is essential for understanding campaign financial health and transparency research, implying the appropriate use case. However, it does not explicitly exclude when to use sibling tools for detailed breakdowns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_committee_flagsA
Check a campaign committee for compliance red flags including RFAIs (Requests for Additional Information from the FEC) and amended filings. Essential for identifying campaign finance compliance issues that merit closer research review.
| Name | Required | Description | Default |
|---|---|---|---|
| committee_id | Yes | FEC committee ID to check for compliance flags | |
| cycle | No | Two-year election cycle to check (e.g., 2024) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description indicates a read-only check for specific flag types, but does not detail side effects, auth requirements, or rate limits. Adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with action and purpose, no superfluous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with two parameters and no output schema; description covers purpose, output type, and rationale. Lacks mention of return format or pagination, but sufficient for a straightforward check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with clear descriptions for both parameters. Description adds no semantic value beyond what schema provides, meeting baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states it checks a campaign committee for compliance red flags (RFAIs, amended filings). Clearly distinguishes from sibling tools that focus on financial data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States it is essential for identifying compliance issues meriting closer review, implying use when investigating compliance. While it doesn't explicitly exclude scenarios, the context is clear given sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_disbursementsA
Retrieve itemized expenditures (Schedule B) made by a campaign committee. Shows payment recipients, amounts, and stated purposes. Supports filtering by amount for researching significant spending patterns and campaign finance transparency.
| Name | Required | Description | Default |
|---|---|---|---|
| committee_id | Yes | FEC committee ID (e.g., "C00401224") | |
| min_amount | No | Minimum disbursement amount to filter (default: $1,000) | |
| two_year_transaction_period | No | Two-year period (e.g., 2024 covers 2023-2024). | |
| cycle | No | Alias for two_year_transaction_period to align with finance cycle filters. | |
| purpose | No | Filter by disbursement purpose keyword (e.g., "CONSULTING", "MEDIA") | |
| include_notable | No | Include flagged-first notable analysis block in output (default: true) | |
| fuzzy_threshold | No | Fuzzy match confidence threshold for reference list matching (default: 90) | |
| limit | No | Number of results to return (default: 20, max: 100) | |
| sort_by | No | Sort results by "amount" (descending) or "date" (most recent first) | amount |
TDQS
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. It correctly portrays the tool as read-only ('Retrieve'), but omits any mention of authentication, rate limits, or whether any state changes occur. While 'Retrieve' is suggestive, an explicit safety statement would improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two short sentences, each serving a clear purpose: first to state the action and resource, second to explain utility. It is front-loaded and free of unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters and no output schema, the description provides a high-level overview but does not detail the response structure or pagination. An agent might need to infer the output format. The description is adequate but not fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, fulfilling the baseline. The description adds only generic value ('filtering by amount') beyond what the schema's parameter descriptions already convey. No additional parameter-specific context is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and resource ('itemized expenditures (Schedule B)'), clearly distinguishing from sibling tools like get_receipts or get_independent_expenditures. It also lists the key data fields (recipients, amounts, purposes), leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions 'researching significant spending patterns and campaign finance transparency' as a use case, but does not provide explicit guidance on when to avoid this tool or compare it with alternatives like get_committee_finances or get_independent_expenditures. The usage context is implied, not articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_independent_expendituresA
Retrieve independent expenditures (Schedule E) - money spent by PACs and Super PACs to support or oppose candidates without coordinating with campaigns. Critical for understanding outside money influence in elections. Can filter by candidate targeted, committee spending, or support/oppose indicator.
| Name | Required | Description | Default |
|---|---|---|---|
| candidate_id | No | FEC candidate ID to find expenditures targeting this candidate | |
| committee_id | No | FEC committee ID to find expenditures made by this committee | |
| support_oppose | No | Filter by support or oppose indicator | |
| min_amount | No | Minimum expenditure amount to include | |
| cycle | No | Two-year election cycle (e.g., 2024) | |
| limit | No | Maximum number of results to return (default: 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It explains the nature of the data (outside money, no coordination) but does not disclose behavioral traits like read-only nature, rate limits, pagination, or response format. Some transparency is gained through the context, but it is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: first defines purpose, second adds importance, third lists key filters. No wasted words, front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters (all documented), no output schema, and no annotations, the description adequately explains the use case and filters. However, it omits any description of the output format (e.g., what fields are returned), which is a gap given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 mentions 'candidate targeted' (candidate_id), 'committee spending' (committee_id), and 'support/oppose indicator' (support_oppose), adding minimal context beyond the schema. It does not cover min_amount or cycle, but these are well-documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'retrieve' and the resource 'independent expenditures (Schedule E)', explaining that they are money spent by PACs and Super PACs to support or oppose candidates. This distinguishes it from sibling tools like 'get_committee_finances' or 'get_receipts'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Critical for understanding outside money influence in elections' and lists filters like candidate targeted and support/oppose indicator, implying when to use the tool. However, it does not explicitly state when not to use it or compare it to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_receiptsA
Retrieve itemized contributions (Schedule A) received by a campaign committee. Shows individual and organizational donors, amounts, and contributor details. Automatically classifies PAC contributions by type (Corporate, Labor, Trade, Leadership PAC) for deeper analysis. Supports filtering by amount threshold for researching significant contributions and campaign finance patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| committee_id | Yes | FEC committee ID (e.g., "C00401224") | |
| min_amount | No | Minimum contribution amount to filter (default: $1,000) | |
| two_year_transaction_period | No | Two-year period (e.g., 2024 covers 2023-2024). | |
| cycle | No | Alias for two_year_transaction_period to align with finance cycle filters. | |
| contributor_type | No | Filter by contributor type: "individual" or "committee" (PAC) | |
| include_notable | No | Include flagged-first notable analysis block in output (default: true) | |
| fuzzy_threshold | No | Fuzzy match confidence threshold for reference list matching (default: 90) | |
| limit | No | Number of results to return (default: 20, max: 100) | |
| sort_by | No | Sort results by "amount" (descending) or "date" (most recent first) | amount |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It notes the auto-classification of PAC contributions and filtering, but does not state that it is read-only, describe pagination, or mention any rate limits. Adequate but lacks full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding value. The most important information (action and resource) comes first. No extraneous content, though structure could be slightly improved with bullet points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description mentions output includes donors, amounts, and details, but lacks specifics on return structure or pagination. Given 9 parameters and no output schema, more detail on the response format would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 value by explaining auto-classification of PAC types (related to contributor_type) and the 'notable analysis block' (include_notable), providing context beyond parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it retrieves itemized contributions (Schedule A) for a campaign committee, distinguishing it from sibling tools like get_disbursements or get_independent_expenditures. The verb 'Retrieve' and the specific reference to contributions make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for contributions received, but does not explicitly state when to use it versus alternatives. Given sibling tools exist, explicit guidance on when to use this tool (e.g., for receipts, not disbursements) would improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_candidatesA
Search FEC records for candidates by name. Returns candidate identifiers and their principal campaign committee IDs, which are required for retrieving detailed financial information. Useful for campaign finance research and transparency investigations.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Candidate name to search for (e.g., "John Smith" or "Smith") | |
| election_year | No | Filter by election year (e.g., 2024) | |
| office | No | Filter by office: H=House, S=Senate, P=President | |
| state | No | Filter by state (2-letter code, e.g., "CA") | |
| party | No | Filter by party code (e.g., "DEM", "REP", "LIB") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It correctly implies a read-only operation via 'search' and 'returns,' but does not explicitly state that no data is modified or mention rate limits, authentication needs, or any 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences convey the purpose, output, and use case with no redundancy or unnecessary words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's actions and output (identifiers and committee IDs) and provides a use case. It lacks information about pagination, result limits, or error handling, but the schema and multiple parameters make it fairly complete for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, each parameter already has a clear description (e.g., q as candidate name, election_year with range). The tool description adds no additional parameter-level detail beyond the schema, meeting the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Search FEC records for candidates by name' and explains what it returns (candidate identifiers and committee IDs). It distinguishes from sibling tools like get_committee_finances or search_donors by focusing on candidates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes that the returned IDs are 'required for retrieving detailed financial information,' implying this tool should be used before committee finance lookups. However, it does not explicitly state when to avoid using it or provide 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.
search_donorsB
Search for individual donors across all FEC filings by name, employer, or occupation. Essential for tracking donor patterns, identifying industry contributions, or researching specific individuals' political giving. Supports searching by employer (e.g., "Goldman Sachs") or occupation (e.g., "Lobbyist", "Government Affairs").
| Name | Required | Description | Default |
|---|---|---|---|
| contributor_name | No | Donor name to search for (partial match supported) | |
| contributor_employer | No | Employer name to search for (e.g., "Google", "Goldman Sachs") | |
| contributor_occupation | No | Occupation to search for (e.g., "Attorney", "Government Affairs", "Lobbyist") | |
| contributor_state | No | Two-letter state code to filter by (e.g., "CA", "NY") | |
| min_amount | No | Minimum contribution amount to include | |
| cycle | No | Two-year election cycle (e.g., 2024) | |
| limit | No | Maximum number of results to return (default: 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only describes the search scope ('across all FEC filings') but does not disclose behavioral traits such as pagination, rate limits, authentication needs, or what happens with no results. The behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: first states the action, second lists use cases, third provides examples. It is front-loaded and concise, with no superfluous information. Every sentence contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 optional parameters and no output schema or annotations, the description adequately explains what the tool does and gives examples. However, it lacks discussion of result format, error handling, or how parameters combine, leaving some gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented. The description adds marginal value with examples (employer: 'Goldman Sachs', occupation: 'Lobbyist'), which clarifies usage but does not significantly deepen understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Search for individual donors' and specifies the resource as 'all FEC filings' with search dimensions name, employer, or occupation. It distinguishes from sibling tools by focusing on donors, but does not explicitly differentiate from other search tools like search_candidates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides use cases like 'tracking donor patterns' and examples of searching by employer or occupation, implying when to use. However, it lacks explicit when-not-to-use guidance or references to alternative tools for other purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_spendingB
Search campaign spending (Schedule B) across all committees by description or recipient. Use to find questionable expenditures like "steak dinner", "event tickets", "travel", "Disney", "golf", or payments to specific vendors. Essential for identifying spending patterns and potential misuse of campaign funds.
| Name | Required | Description | Default |
|---|---|---|---|
| description | No | Search disbursement descriptions for keywords (e.g., "dinner", "travel", "event tickets", "Disney") | |
| recipient_name | No | Search for payments to a specific recipient/vendor | |
| recipient_state | No | Two-letter state code to filter by (e.g., "FL", "NV") | |
| min_amount | No | Minimum disbursement amount to include | |
| cycle | No | Two-year election cycle (e.g., 2024) | |
| limit | No | Maximum number of results to return (default: 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only implies a read operation via the word 'search' and notes that it operates 'across all committees'. It does not disclose potential rate limits, pagination, data freshness, or whether it requires authentication. This is minimal for a tool with no other behavioral hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences and a line, front-loading the core purpose and specific search examples. Every sentence adds value, and there is no redundant or vague language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 6 parameters and no output schema, the description does not mention the return format or structure (e.g., list of disbursements). It also lacks information on default behavior, such as ordering or result limit details beyond what the 'limit' parameter specifies. This leaves the agent uncertain about what to expect from the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all 6 parameters with descriptions (100% coverage). The description adds value by providing concrete examples for the 'description' parameter (e.g., 'dinner', 'travel', 'Disney') but does not add meaning beyond the schema for other parameters. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches campaign spending by description or recipient across all committees, with specific examples like 'steak dinner' and 'Disney'. However, it does not explicitly differentiate from the sibling tool 'get_disbursements', which also searches disbursements, missing an opportunity to clarify distinct use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by listing example searches (e.g., 'event tickets', 'golf') and states its purpose for identifying spending patterns. However, it does not mention when to use this tool versus alternatives like 'get_disbursements' or 'get_committee_finances', nor does it specify when not to use it.
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 tool update
- Changed
get_independent_expenditures1 field changed- changed
Input schema / properties / candidate_id / patternPrevious value: -"^[A-Z]\\d{8}$"New value: +"^(?:[HS]\\d[A-Z]{2}\\d{5}|P\\d{8})$"
8 tool updates
v1.0.0- First observed
get_committee_finances - First observed
get_committee_flags - First observed
get_disbursements - First observed
get_independent_expenditures - First observed
get_receipts - First observed
search_candidates - First observed
search_donors - First observed
search_spending
TDQS
Scored across 8 tools
Each tool targets a distinct FEC data type or search entity: committee finances vs. compliance flags vs. specific schedules (disbursements, receipts, independent expenditures) vs. searches (candidates, donors, spending). No ambiguity.
All tools follow a consistent 'verb_noun' pattern with lowercase underscore separation: get_*, search_*. No mixing of conventions.
8 tools is a well-scoped count for campaign finance research. Covers committee summary, key schedules, and targeted searches without being overwhelming or too thin.
Covers core CRUD-like operations (retrieve summaries, itemized receipts/disbursements, independent expenditures, compliance flags) and search. Minor gap: no dedicated tool for committee details beyond finances, but searches provide identifiers. Solid for the domain.
Maintenance
Related MCP Connectors
Access FEC campaign finance data. Query data about candidates, money trails, and election filings.
FEC campaign finance data: candidate fundraising, donors, and spending
OpenFEC MCP — Federal Election Commission campaign finance data
U.S. federal policy data — bills, Congress members, voting records, and civic info.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects the OpenFEC API to AI assistants for investigating US federal campaign finance through natural language conversations.1MIT
- AlicenseNot gradedqualityAmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.473 npm2Apache 2.0
- AlicenseBqualityDmaintenanceEnables querying state-level campaign finance data, including donors, expenditures, committees, and candidates, from multiple state disclosure systems via a unified MCP interface.9MIT
- AlicenseNot gradedqualityDmaintenanceEnables searching political donations, donors, and lobbying data from any AI assistant using Federal Election Commission data.8 npmMIT