Skip to main content
Glama
cfpb-complaints-mcp

cfpb-complaints-mcp

by bnovarini

complaint_counts

Count CFPB complaints and group them by date, product, issue, company, state, or response to compare complaint volumes and outcome rates.

Instructions

Count complaints, optionally grouped. group_by is one or two of: year, quarter, month, product, sub_product, issue, sub_issue, company, state, company_response, company_public_response, submitted_via, timely_response. Returns complaints, timely_rate, monetary_relief_rate, nonmonetary_relief_rate, in_progress_rate per group (rates are fractions of that group's complaints). Counts are raw complaint counts, not adjusted for company size. In progress and Untimely response are CFPB response categories, not outcomes. Filters: company (exact name as in find_company), company_contains (substring), product, sub_product, issue, product: CFPB renamed credit reporting twice, so it appears under three product names (use list_values field=product), company_response (exact CFPB value, case-insensitive), submitted_via, state (2 letters), tag (e.g. 'Servicemember', 'Older American'), timely (true/false), date_from/date_to (YYYY-MM-DD or YYYY-MM, on date received).

Input Schema

NameRequiredDescriptionDefault
tagNo
issueNo
limitNo
stateNo
offsetNo
timelyNo
companyNo
date_toNo
productNo
group_byNo
order_byNocomplaints
date_fromNo
sub_productNo
has_narrativeNo
submitted_viaNo
company_containsNo
company_responseNo

Output Schema

NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.3

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does so well for a read tool: it names every returned metric, notes that rates are fractions of each group's complaints, warns that counts are raw and not adjusted for company size, and clarifies that 'In progress'/'Untimely' are CFPB response categories rather than outcomes. It omits any note on pagination/limit semantics or auth, but the analytical caveats are unusually strong.

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?

It is a single dense paragraph but well front-loaded: purpose and return shape first, then filters. Nearly every clause carries parameter or return semantics, though the run-on packing of filters into one sentence slightly hurts scannability.

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?

An output schema exists, so the return-shape detail is a bonus rather than a requirement, and the filter semantics are mostly covered. The gaps are the undocumented pagination/order params (limit, offset, order_by) and has_narrative, which an agent manipulating results would need given the total absence of schema descriptions.

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 0% across 17 params, so the description must compensate, and it documents the majority: group_by values, company vs company_contains (exact vs substring), state (2 letters), company_response (exact, case-insensitive), tag examples, timely true/false, and date_from/date_to formats (YYYY-MM-DD or YYYY-MM, on date received). It leaves limit, offset, order_by, and has_narrative undocumented, which is a real gap given the coverage is otherwise nil.

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?

Starts with a specific verb+resource: 'Count complaints, optionally grouped.' The scope (aggregate counts with optional grouping, distinct from per-record tools like get_complaint and from count_narratives) is immediately clear, and the enumerated group_by values pin down exactly what aggregation means here.

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?

It routes the agent to siblings for prerequisites and edge cases: 'company (exact name as in find_company)' and 'use list_values field=product' for the renamed product names. It clearly frames which parameters are filters and how to match them, though it never states an explicit when-not or names a competing aggregation sibling to prefer instead.

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