Skip to main content
Glama
cstillick

statefinance-mcp

by cstillick

statefinance-mcp

State-level campaign finance, as an MCP server. Donors, expenditures, committees, and candidates from state disclosure systems — the data the FEC doesn't cover and that no MCP server currently exposes — through one common schema. Oklahoma first; more states via adapters.

Why this exists

Federal campaign finance (FEC) is wrapped to death. State campaign finance — where most money-in-politics questions actually live — is fragmented across ~46 portals with no unified API, and the one historical normalizer (FollowTheMoney) is winding down. The hard, valuable part isn't the MCP plumbing; it's the normalization layer that maps a messy state portal into a clean, sourced schema. That's the product.

Related MCP server: @cyanheads/openfec-mcp-server

Quick start (offline, no keys)

The v1 demo runs on a committed synthetic Oklahoma extract (see the data note below), so a fresh checkout works with no network and no keys.

uv sync

uv run statefinance ingest ok            # load the OK 2024 sample into the store
uv run statefinance top-donors "Tallchief for Oklahoma"
#   Redbud Ranch LLC: $10,000
#   Acme Energy, LLC: $5,000   (spelling variants combined)
#   Patterson, John Q.: $1,500
uv run statefinance summary cycle 2024
#   raised $30,650, spent $76,200, top recipient: Tallchief for Oklahoma

uv run statefinance donor-history "Patterson, John Q."   # all of a donor's giving
uv run statefinance serve                                # run the MCP server (stdio)

Use it as an MCP server

{
  "mcpServers": {
    "statefinance": {
      "command": "uv",
      "args": ["run", "statefinance", "serve"],
      "cwd": "/path/to/statefinance-mcp"
    }
  }
}

Tools

Tool

What it does

search_contributions

Filter contributions by donor, recipient, candidate, amount/date range, state, cycle. Returns matches + full-match count and total.

search_expenditures

Filter expenditures by committee, payee, purpose, date, state, cycle.

get_committee

A committee plus its contribution and expenditure totals.

get_candidate

A candidate (by id or name), their committees, and money raised/spent.

top_donors

Top donors to a committee, grouped by a light-normalized donor key.

donor_history

Every contribution by a donor, with a per-recipient breakdown.

summary

Aggregate totals for a committee, candidate, or cycle.

Every result carries each record's source_url + as_of — this is accountability data, so a wrong number is worse than no number.

Design: one schema, many adapters

state portal ─▶ StateAdapter.fetch()  ─▶ raw snapshot (data/raw/<state>/)
                StateAdapter.normalize() ─▶ common schema ─▶ DuckDB store
                                                                  │
                                            MCP server (reads the store only)
  • Ingestion and serving are decoupled. Ingest populates a local normalized store; the MCP server only reads it, so tool calls are fast and portals stay un-hammered.

  • Adding a state is implement fetch + normalize, ship a fixture, register — core, store, and tools untouched. See docs/adding-a-state.md (enforced by a test that adds a second state through the adapter contract alone).

  • Donor normalization is light and honest (trim/case/whitespace, org suffixes). Fuzzy entity resolution is explicitly deferred — see docs/donor-normalization.md.

⚠️ Data note

The committed Oklahoma sample is synthetic (fictional committees, candidates, donors — clearly labeled), so the offline demo never asserts fabricated facts about real people. Acquisition of real Oklahoma data and the ToS posture are documented in docs/sources/oklahoma.md; live ingestion is intentionally gated — enable ingest ok --live only after confirming the portal's current export method and terms of service.

Development

uv run pytest        # offline suite (committed synthetic extract)
uv run ruff check .  # lint

If uv run statefinance ever reports No module named 'statefinance' (a known editable-install quirk on some setups, e.g. paths with spaces), run with PYTHONPATH=src uv run statefinance ....

See SPEC.md and BUILD_PLAN.md for the design.

License

MIT.

Available Tools

9 tools
donor_historyC

Every contribution by a donor, with totals and a per-recipient breakdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
cycleNo
stateNo

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations, the description carries full burden for behavioral disclosure. It only states what the output includes (totals and per-recipient breakdown), but does not disclose whether the operation is read-only, requires authentication, has rate limits, or how it handles missing donors. The behavioral information 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.

Conciseness4/5

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

The description is extremely concise (one sentence, 12 words) and front-loaded with the core purpose. However, its brevity comes at the cost of missing important details about parameters and usage, which slightly reduces the score.

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

Completeness2/5

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

Given the tool has 3 parameters, no output schema, and no annotations, the description is incomplete. It does not explain what the parameters mean, what the exact return format is, or how to interpret the 'totals' and 'per-recipient breakdown'. The description would be insufficient for an AI agent to use the tool correctly without additional context.

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

Parameters1/5

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

Schema description coverage is 0%, and the description adds no meaning to the three parameters. It does not explain that 'name' likely refers to the donor's name, nor does it clarify the purpose of 'cycle' and 'state' (e.g., election cycle, donor state). The description fails to compensate for the schema's lack of descriptions.

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's purpose: retrieving every contribution by a donor, with totals and per-recipient breakdown. It uses a specific verb (shows/retrieves) and identifies the resource (donor contributions). This distinguishes it from sibling tools like top_donors (which aggregates top donors) or search_contributions (which searches across contributions).

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. It does not specify that it is for looking up a specific donor's history, nor does it mention situations where other tools (e.g., search_contributions) would be more appropriate. No exclusions or context provided.

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

get_candidateC

A candidate (by id or name), their committees, and money raised/spent.

ParametersJSON Schema
NameRequiredDescriptionDefault
candidate_idYes

TDQS

C2.6/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 behavior. It mentions returned data (candidate info, committees, money) but omits crucial details like read-only nature, error conditions, authentication requirements, or side effects. The information is minimal and insufficient.

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

Conciseness3/5

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

The description is a single sentence, which is concise. However, it contains inaccuracies and lacks detail, making it more under-specified than efficiently designed. It could be improved with clear, correct information.

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

Completeness2/5

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

For a tool with one required parameter, no output schema, and no annotations, the description is incomplete. It does not explain return format, pagination, or valid parameter values. The inaccuracy about the name parameter further reduces completeness.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It adds some meaning by stating the parameter identifies a candidate, but it inaccurately suggests a 'name' parameter exists, creating ambiguity. The description partially adds value but also misleads.

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 it retrieves a candidate (by id or name) along with their committees and financial data. It distinguishes from siblings like 'get_committee' which focuses solely on committees. However, the verb is implicit and not explicit.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. The description mentions 'by id or name' but the schema only has a 'candidate_id' parameter, which is misleading and implies an additional parameter that does not exist.

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

get_committeeC

A committee plus its contribution and expenditure totals.

ParametersJSON Schema
NameRequiredDescriptionDefault
committee_idYes

TDQS

C2.4/5.0
Behavior2/5

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

No annotations are provided, and the description does not disclose behavioral traits such as read-only nature, error handling (e.g., missing committee_id), rate limits, or idempotency. The phrase 'plus its contribution and expenditure totals' hints at the return structure but is insufficient.

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

Conciseness3/5

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

The description is very short (one sentence), which is concise, but it sacrifices necessary detail. It is not structured with sections or examples, making it too terse for adequate understanding.

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

Completeness2/5

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

Given no output schema and no behavioral annotations, the description should provide more context about the response structure, possible values, or error conditions. It does not, leaving the agent with significant ambiguity.

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

Parameters1/5

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

The input schema has one parameter 'committee_id' with 0% schema description coverage. The description adds no information about this parameter—no explanation of format, examples, or how to obtain it. This is a critical gap for a required parameter.

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 clarifies that the tool returns not just a committee but also its contribution and expenditure totals, which distinguishes it from sibling tools like 'get_candidate' or search tools. However, it lacks an active verb like 'retrieve' and could be more explicit.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like 'search_contributions' or 'summary'. The description does not specify context or prerequisites.

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

pingA

Health check. Returns 'pong' if the server is alive.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

The description states it returns 'pong' if alive, but does not disclose behavior on failure (e.g., error or timeout). However, for a simple health check, this is adequate given no annotations.

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 with two short sentences, front-loading the purpose. Every word serves a purpose.

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 zero-parameter health check tool with an output schema, the description sufficiently covers purpose and return value. No additional information is 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?

There are no parameters and the schema is empty (100% coverage). The description adds no extra parameter information beyond what the schema provides, so baseline score applies.

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 tool name 'ping' and description 'Health check' clearly indicate a connectivity test. No sibling tool serves a similar purpose, making its function unambiguous.

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 specifies the tool is for checking server liveness. Although no explicit alternatives or exclusions are given, the sibling tools are all data query tools, so the context strongly implies usage for verifying server status before other calls.

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

search_contributionsA

Search campaign contributions by donor, recipient committee, candidate, amount range, date range, state, or cycle. Returns matching contributions (each with source_url + as_of) plus the full-match count and total.

ParametersJSON Schema
NameRequiredDescriptionDefault
donorNo
recipientNo
candidateNo
min_amountNo
max_amountNo
date_fromNo
date_toNo
stateNo
cycleNo
limitNo

TDQS

A3.5/5.0
Behavior3/5

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 discloses that the tool returns 'matching contributions (each with source_url + as_of) plus the full-match count and total.' However, it does not mention any rate limits, authentication requirements, or side effects. For a read-only search, this is adequate but not comprehensive.

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

Conciseness4/5

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

Two sentences: the first lists search criteria, the second describes return fields. No redundant or irrelevant content. It is concise, though the complexity of 10 parameters might warrant slightly more structure (e.g., bullet points).

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

Completeness3/5

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

Given 10 optional parameters and no output schema, the description covers the core purpose and return format but omits details like pagination (limit parameter exists but no explanation), combination logic of filters, or data types. It is minimally complete for a search tool.

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

Parameters2/5

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

Schema description coverage is 0%. The description lists the parameter categories (donor, recipient, etc.) in the first sentence, which adds context beyond the schema's plain titles, but does not explain formats or constraints (e.g., date format, state codes). With 10 parameters, more detail is needed for clarity.

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 the verb 'search' and specifies the resource 'campaign contributions' with multiple searchable criteria (donor, recipient, candidate, amount, date, state, cycle). It clearly distinguishes from sibling tools like get_candidate or donor_history, which retrieve individual entities.

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 when to use this tool—when searching for contributions by various filters—but does not explicitly state when not to use it or mention alternatives. No exclusions or prerequisites are provided.

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

search_expendituresA

Search expenditures by committee, payee, purpose, date range, state, or cycle. Returns matching expenditures (with provenance) plus count and total.

ParametersJSON Schema
NameRequiredDescriptionDefault
committeeNo
payeeNo
purposeNo
date_fromNo
date_toNo
stateNo
cycleNo
limitNo

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool returns expenditures with provenance plus count and total, which adds behavioral context beyond a basic search. However, it does not mention pagination, rate limits, or auth requirements.

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-loading the key filters and output. Every phrase is informative, and there is no 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 8 parameters with no schema descriptions and no output schema, the description adequately covers tool purpose, filters, and return values. It could mention pagination behavior for the limit parameter, but overall it is 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 0% for 8 parameters, so the description must compensate. It lists the filter parameters in plain language but omits format details (e.g., date format, state codes) and constraints, leaving gaps for an agent.

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 'search' and resource 'expenditures', listing multiple filter dimensions (committee, payee, purpose, date range, state, cycle) and output details (expenditures with provenance, count, total). This distinguishes it from sibling tools like search_contributions.

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 by enumerating filters but does not explicitly state when to use this tool versus alternatives like search_contributions, nor does it provide exclusions or prerequisites.

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

store_statsB

Row counts for the normalized store (committees, candidates, ...).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior3/5

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

Without annotations, the description indicates a read-only statistical operation. However, it doesn't disclose potential performance implications or whether counts are cached or real-time.

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

Conciseness4/5

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

The description is a single, efficient sentence that conveys the core purpose with no unnecessary words.

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

Completeness3/5

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

Given the zero-parameter schema and no output schema, the description is minimally adequate. It does not specify output format or structure, which could be inferred but not explicit.

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?

No parameters exist, so schema coverage is 100%. The description adds no parameter context, which is acceptable given zero parameters.

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 provides row counts for the normalized store, mentioning specific entities. It implicitly distinguishes from sibling tools that deal with individual records, but lacks explicit differentiation.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. The description provides no context for usage scenarios or exclusions.

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

summaryC

Aggregate totals for a committee, candidate, or cycle.

ParametersJSON Schema
NameRequiredDescriptionDefault
scope_typeYes
scope_idYes

TDQS

C2.9/5.0
Behavior2/5

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

The description implies read-only aggregation, but with no annotations to confirm, it fails to disclose safety guarantees, required permissions, or whether the tool is destructive. It also does not mention pagination, rate limits, or data freshness.

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

Conciseness4/5

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

The description is a single, front-loaded sentence that immediately conveys the tool's purpose. It is concise but lacks necessary details, which prevents a perfect score.

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

Completeness2/5

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

Given the lack of output schema and annotations, the description should explain what aggregated totals are returned (e.g., total contributions, total expenditures). It does not, nor does it address the meaning of 'cycle' or how results are structured.

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?

With 0% schema coverage, the description adds key meaning by listing possible scope_type values (committee, candidate, cycle). However, it does not clarify the format of scope_id (e.g., FEC ID, candidate ID, cycle year) or provide examples, leaving ambiguity.

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 aggregates totals for committee, candidate, or cycle resources. It uses specific verbs and resources, but does not distinguish from siblings like top_donors or get_candidate which may also provide summary-like data.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as get_committee, get_candidate, or search_contributions. There is no mention of prerequisites or exclusion criteria.

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

top_donorsB

The top donors to a recipient committee, ranked by total given (spelling variants combined via light normalization).

ParametersJSON Schema
NameRequiredDescriptionDefault
recipientYes
cycleNo
nNo

TDQS

B3/5.0
Behavior3/5

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

The description adds behavioral context about spelling variant normalization but lacks details on output format, pagination, rate limits, or being read-only. With no annotations, it partially fulfills transparency.

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

Conciseness4/5

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

A single sentence with no fluff, but could be better structured with parameter hints. However, it is concise and front-loaded with the main action.

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

Completeness2/5

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

With 3 undocumented parameters, no output schema, and no annotations, the description is insufficient for correct invocation. It lacks details on how to specify cycle or n, and what the return value contains.

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

Parameters1/5

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

Schema coverage is 0% and the description provides no explanation of parameters (recipient, cycle, n). The agent must infer their meaning from names alone, which is insufficient.

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 returns top donors to a recipient committee, ranked by total given, with spelling normalization. It is specific and distinct from sibling tools like donor_history or search_contributions.

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

Usage Guidelines2/5

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

No guidance on when to use this tool vs alternatives, prerequisites, or scenarios. The description only states what it does without context for selection.

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. Dates show when Glama detected each change.

  1. 9 tool updatesv0.1.0
    • First observeddonor_history
    • First observedget_candidate
    • First observedget_committee
    • First observedping
    • First observedsearch_contributions
    • First observedsearch_expenditures
    • First observedstore_stats
    • First observedsummary
    • First observedtop_donors

TDQS

B3.2/5.0
Disambiguation5/5

Each tool serves a distinct purpose: donor history, candidate info, committee info, health check, contribution search, expenditure search, store stats, summary aggregates, and top donors. There is no ambiguity between them.

Naming Consistency2/5

Tool names mix verb-noun patterns (get_candidate, search_contributions) with noun phrases (donor_history, summary, ping) and inconsistent styles. This lack of a consistent pattern reduces predictability.

Tool Count5/5

With 9 tools, the set is well-scoped for a state finance data server. It covers essential queries without being overwhelming or too sparse.

Completeness4/5

The tools cover core workflows: lookup candidates, committees, donors, contributions, expenditures, and summaries. Minor gaps exist (e.g., no listing of all candidates or committees), but the surface is largely complete for a read-oriented server.

Maintenance

ActivityStale
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Query FEC campaign finance data — search candidates, track donations, analyze spending, and monitor Super PAC activity via the OpenFEC API.
    8
    20
    4
    MIT
  • A
    license
    B
    quality
    F
    maintenance
    MCP server for Oklahoma campaign finance data, enabling queries on combined pre-primary and continuing contributions, candidate flags, and more via natural language.
    13
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Access Federal Election Commission campaign finance data through MCP tools. Enables querying OpenFEC data using natural language via ask_pipeworx or direct tool calls.
    16
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cstillick/statefinance-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server