us-lobbying-mcp-server
Server Details
Search US lobbying disclosures and foreign-agent registrations via MCP.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/us-lobbying-mcp-server
- GitHub Stars
- 1
- Server Listing
- us-lobbying-mcp-server
TDQS
Scored across 9 tools
Each tool targets a fairly distinct resource: filings, foreign agents, lobbyists, contributions, issue spending, client profiles, reference vocabularies, and staged-table SQL. Some boundaries blur—get_issue_spending vs. search_filings with issue_code filters, and the dataframe_* tools overlap with every analytical tool as a generic SQL escape hatch—but the dense descriptions do enough to steer selection.
All tools share the uslobbying_ prefix and mostly follow verb_noun (get_client_profile, search_filings, list_reference). The two dataframe_describe/dataframe_query tools invert to noun_verb, a minor deviation from the otherwise consistent pattern.
Nine tools is well-scoped for a lobbying-disclosure research server, covering each data domain (LDA filings, FARA, LD-203, lobbyists, references) plus the SQL inspection pair without redundancy.
The surface covers search and full-record retrieval for filings, contributions, issue spending, lobbyists, foreign agents, client relationships, and reference vocabularies, giving near-complete coverage. Minor gaps: no dedicated registrant/government-entity profile tool, and no explicit export/raw-document retrieval beyond filing_uuid lookups.
Available Tools
9 toolsuslobbying_dataframe_describeDescribe disclosure tablesBRead-onlyIdempotentInspect
Inspect exact staged table schemas, row counts, lifecycle, acquisition coverage and provenance before SQL.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | Canvas token returned by an analytical disclosure tool. | |
| table_name | No | Existing table to inspect; omit for every table in this canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| tables | No | Complete table metadata, or an empty array for an empty canvas. |
| guidance | No | Table names and dataframe instructions. |
| canvas_id | No | Tenant-scoped canvas access token. |
| query_tool | No | Query or retrieve materialized table rows. |
| describe_tool | No | Inspect exact table schemas before SQL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds that this is a pre-SQL inspection step and enumerates the facets examined (lifecycle, acquisition coverage, provenance), which is real added context, but it says nothing about cost, size of output, or whether inspection reveals staleness/caveats.
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?
A single dense sentence with the action and the timing constraint front-loaded; there is no filler. The stacked noun list ('lifecycle, acquisition coverage and provenance') is slightly opaque but each item conveys a distinct facet.
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?
An output schema exists so return values need no explanation, and the two parameters are fully specified structurally. What is missing is conceptual grounding: how a canvas_id is obtained, what 'staged' versus live tables means, and whether inspection is required before querying.
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% and both parameters are documented there, including the 'omit for every table in this canvas' semantics. The description adds no parameter-level meaning beyond the schema, so baseline 3 applies.
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?
States a specific verb (inspect) and a specific set of resources (staged table schemas, row counts, lifecycle, coverage, provenance), which is clearly distinct from the query sibling. The phrase 'staged table' is never defined, so an agent unfamiliar with the canvas workflow must infer what is being inspected.
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?
'before SQL' implies a preflight role ahead of uslobbying_dataframe_query, which is useful implied sequencing. However, the alternative tool is not named, and there is no explicit statement of when not to use this or what to do first (e.g., that a canvas_id must already exist from another tool).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_dataframe_queryQuery disclosure tablesAInspect
Run one read-only SELECT over staged disclosure tables, materialize the complete result, then retrieve whole rows by result_table and next_offset without rerunning SQL. Inspect columns with uslobbying_dataframe_describe first.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | No | One read-only SELECT; exclusive with result_table and offset. | |
| offset | No | Canonical row offset for result_table, default zero. | |
| canvas_id | Yes | Canvas token returned by a disclosure analytical tool. | |
| row_limit | No | Maximum whole rows in this response; positive integers clamp to 100, then to any lower provider ceiling. | |
| register_as | No | Fresh result table name for a new SQL call; omit for a generated name. | |
| result_table | No | Previously materialized result table; exclusive with sql and register_as. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Whole JSON-safe rows. |
| error | No | Present when the call failed. Absent on success. |
| offset | No | Canonical-order starting row offset. |
| columns | No | Complete result schema. |
| dataset | No | Materialized dataset and routing. |
| guidance | No | Table names and dataframe instructions. |
| canvas_id | No | Tenant-scoped canvas access token. |
| row_count | No | Exact materialized result count. |
| row_order | No | Delivery orders by all materialized values. |
| truncated | No | More materialized rows remain; continue with next_offset. |
| query_tool | No | Query or retrieve materialized table rows. |
| next_offset | No | Next undelivered row offset. |
| result_table | No | Stable materialized result table. |
| describe_tool | No | Inspect exact table schemas before SQL. |
| rows_returned | No | Rows actually delivered. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| output_complete | No | Whether this result has no remaining delivery rows. |
| effective_row_limit | No | Effective row limit when a delivery or provider ceiling lowers the requested limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavior beyond the annotations: one SELECT is executed, the complete result is materialized, and subsequent row retrieval does not rerun SQL. This clarifies the stateful materialization step, which is consistent with readOnlyHint=false, while annotations already cover destructive and idempotent characteristics.
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 sentences, front-loaded with the primary action, and no wasted text. The prerequisite follows naturally after the workflow description.
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 core workflow, materialization behavior, retrieval path, and the describe-first prerequisite. With a full output schema and complete parameter descriptions, the remaining details are adequately handled by structured fields, though the next_offset/offset wording could be tightened.
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 the baseline is 3. The description adds useful mode semantics around sql, result_table, and offset-based row retrieval, though it refers to 'next_offset' while the schema parameter is 'offset', creating a minor terminology mismatch.
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 states a specific verb and resource: run one read-only SELECT over staged disclosure tables, materialize results, and retrieve rows by result table. It clearly distinguishes the SQL path from the retrieval path, and points to the sibling describe tool for column inspection.
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?
It gives a clear workflow prerequisite: inspect columns with uslobbying_dataframe_describe first. It also explains the two operating modes, SQL versus result_table retrieval, though it does not explicitly compare when to use this tool instead of the other search-oriented siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_get_client_profileUslobbying Get Client ProfileARead-onlyIdempotentInspect
Resolve client relationship records by client_name in mode resolve (default), then use mode profile with explicit client_ids and years. Select candidates[].id, preserving secondary client_id as source data. IDs identify registrant relationships, not a verified corporate identity. Follow collecting cursors before interpreting separate income and expense ledgers. Typed rows preserve every audit filing; pass a selected filing UUID to uslobbying_search_filings for its complete record. Optional canvas datasets support SQL.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | resolve (default) finds client_name candidates; profile requires selected client_ids and years. Omit on continuation. | |
| years | No | Required explicit analytical year scope; sorted and deduplicated. | |
| cursor | No | Continue the original scope; other query fields may be omitted. | |
| row_sets | No | Inline analytical sets; omit for all sets. Selection never limits acquisition, totals or SQL staging. Omitted sets remain available from a new call with another selection or staged tables. Continue with omitted or equivalent row_sets. | |
| canvas_id | No | Reuse this canvas only after complete analytical acquisition. | |
| max_pages | No | Source pages per call; positive integers clamp to five, default one for discovery, five for analysis. | |
| page_size | No | Upstream rows per page; positive integers clamp to 25, default 25. | |
| client_ids | No | Required explicit relationship record IDs from candidates[].id in profile mode; candidates[].client_id is a secondary source number. | |
| client_name | No | Required literal name in resolve mode. | |
| record_path | No | JSON Pointer to a stored value; empty selects the root. | |
| record_limit | No | Maximum object entries or array items, clamped to 25; text fragments use the response byte budget. | |
| record_handle | No | Tenant/tool-bound deferred record handle. | |
| record_offset | No | Key, item or Unicode-code-point offset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | Client resolution or selected relationship analysis; absent on stored-record retrieval. |
| error | No | Present when the call failed. Absent on success. |
| firms | No | Firm breakdowns in this window. |
| years | No | Explicit requested years. |
| offset | No | Final record delivery offset. |
| source | No | Official source system. |
| status | No | Source acquisition status, separate from row delivery. |
| dataset | No | Complete SQL metadata on the first final window and its replay. |
| notices | No | Limitations and success notices. |
| coverage | No | Acquisition progress, independent of delivery. |
| guidance | No | Next profile-mode selection step. |
| canvas_id | No | Tenant-scoped canvas access token. |
| truncated | No | More data is available through next_cursor or record_handles; no source data was discarded. |
| activities | No | Selected activities in this window; no money columns. |
| candidates | No | All matching relationships; never auto-merged. |
| client_ids | No | Caller-selected client relationship IDs. |
| query_tool | No | Query or retrieve materialized table rows. |
| selections | No | Version-selection decisions in this window. |
| attribution | No | Required verbatim attribution for LDA data. |
| issue_codes | No | Overlapping issue breakdowns in this window. |
| methodology | No | Accounting limitations. |
| next_cursor | No | Next acquisition or output window cursor. |
| raw_filings | No | All acquired versions in this window, including selected versions. |
| retrieved_at | No | Retrieval ISO timestamp. |
| describe_tool | No | Inspect exact table schemas before SQL. |
| record_window | No | Lossless stored parent window. |
| total_records | No | Exact final record count when known. |
| annual_ledgers | No | Complete-year ledgers in this window; absent while collecting. |
| record_handles | No | Deferred complete parents. |
| retrieval_tool | No | Tool that retrieves this parent. |
| row_set_totals | No | Exact all-set totals after acquisition completes. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| output_complete | No | Whether all result rows have been delivered. |
| row_set_offsets | No | Selected-set rows delivered or deferred before this window; others zero. |
| canvas_available | No | SQL canvas support is enabled. |
| records_deferred | No | Oversized parents available through handles. |
| records_returned | No | Complete records delivered in this window. |
| selected_filings | No | Complete selected filings in this window. |
| attribution_basis | No | Whole filings mentioning an issue; buckets overlap. |
| cursor_expires_at | No | Continuation expiry ISO timestamp. |
| effective_filters | No | Normalized effective scope. |
| targeted_entities | No | Targeted entities in this window. |
| snapshot_source_urls | No | Official snapshot URLs. |
| snapshot_retrieved_at | No | FARA snapshot retrieval timestamp. |
| snapshot_last_modified | No | Upstream Last-Modified header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/open-world, but the description adds non-obvious behavioral caveats: IDs identify registrant relationships rather than verified corporate identity, typed rows preserve every audit filing, and cursors must be collected before interpreting separate income/expense ledgers. These are real behavioral disclosures beyond the structured fields, though pagination and response-size behavior are only in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core workflow in the first sentence and refinements (cursors, filing UUID handoff, canvas SQL) after. It is jargon-heavy but each sentence carries information; minor tightening could improve it.
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 13-parameter, two-mode tool with an output schema and read-only annotations, the description covers the workflow, the ID caveat, cursor handling, and the handoff to search_filings. Return-value details are delegated to the output schema appropriately; only minor gaps (e.g., canvas staging details) remain.
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 the baseline is 3, but the description adds genuine meaning: it clarifies that candidates[].id should be selected while the secondary client_id is preserved as source data, and explains the resolve/profile mode split. That goes beyond restating schema field 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?
The description states a specific verb and resource ('Resolve client relationship records by client_name') and clearly delineates the two modes (resolve vs profile). It names one downstream sibling (uslobbying_search_filings) but does not distinguish itself from the other search_* siblings, so it is clear but not fully differentiated.
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?
It gives an explicit two-step workflow (resolve by client_name first, then profile with explicit client_ids and years) and tells the agent to follow collecting cursors before interpreting ledgers. It routes the agent to uslobbying_search_filings for complete filing records, though it does not explicitly say when NOT to use this tool versus the other sibling searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_get_contributionsUslobbying Get ContributionsARead-onlyIdempotentInspect
Retrieve complete semiannual LD-203 reports, contributions, PAC relationships and certifications, preserving original and amended reports. Child predicates must match the same item; full parent contribution lists and matched_item_indexes remain available. Report counts are not donation counts and no cross-report donation total is inferred.
| Name | Required | Description | Default |
|---|---|---|---|
| payee | No | Case-insensitive literal payee substring. | |
| cursor | No | Continue the original scope; other query fields may be omitted. | |
| honoree | No | Case-insensitive literal honoree substring. | |
| max_pages | No | Source pages per call; positive integers clamp to five, default one for discovery, five for analysis. | |
| page_size | No | Upstream rows per page; positive integers clamp to 25, default 25. | |
| amount_max | No | Inclusive local same-item maximum exact decimal USD; complete parent lists remain available. | |
| amount_min | No | Inclusive local same-item minimum exact decimal USD; complete parent lists remain available. | |
| contributor | No | Case-insensitive literal contributor substring. | |
| filing_year | No | Required first-call reporting year, 2008 through current UTC year. | |
| lobbyist_id | No | Lobbyist filer ID. | |
| record_path | No | JSON Pointer to a stored value; empty selects the root. | |
| record_limit | No | Maximum object entries or array items, clamped to 25; text fragments use the response byte budget. | |
| filing_period | No | Semiannual period. | |
| lobbyist_name | No | Lobbyist name upstream search. | |
| record_handle | No | Tenant/tool-bound deferred record handle. | |
| record_offset | No | Key, item or Unicode-code-point offset. | |
| registrant_id | No | Registrant ID. | |
| registrant_name | No | Registrant name upstream search. | |
| contribution_type | No | Official feca, he, me, ple or pic payment code. | |
| contribution_date_after | No | Inclusive earliest item calendar date. | |
| contribution_date_before | No | Inclusive latest item calendar date. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| offset | No | Final record delivery offset. |
| source | No | Official source system. |
| notices | No | Limitations and success notices. |
| reports | No | Full parent reports and complete child lists. |
| coverage | No | Acquisition progress, independent of delivery. |
| truncated | No | More of the parent value remains available through record windows. |
| attribution | No | Required verbatim attribution for LDA data. |
| next_cursor | No | Next acquisition or output window cursor. |
| retrieved_at | No | Retrieval ISO timestamp. |
| record_window | No | Lossless stored parent window. |
| total_records | No | Exact final record count when known. |
| record_handles | No | Deferred complete parents. |
| retrieval_tool | No | Tool that retrieves this parent. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| output_complete | No | Whether all result rows have been delivered. |
| amendment_policy | No | Amendments remain separate reports. |
| records_deferred | No | Oversized parents available through handles. |
| records_returned | No | Complete records delivered in this window. |
| cursor_expires_at | No | Continuation expiry ISO timestamp. |
| effective_filters | No | Normalized effective scope. |
| item_count_in_batch | No | Items in returned complete parent lists. |
| snapshot_source_urls | No | Official snapshot URLs. |
| report_count_in_batch | No | Complete parent reports returned. |
| snapshot_retrieved_at | No | FARA snapshot retrieval timestamp. |
| snapshot_last_modified | No | Upstream Last-Modified header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the readOnly/idempotent annotations: original and amended reports are preserved, child predicates must match the same item, matched_item_indexes and full parent lists remain available, and report counts are not donation counts with no cross-report totals inferred. That last point is a meaningful anti-misinterpretation warning not encoded anywhere in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct information: scope, item-matching rule, and counting caveat. Front-loaded with what is retrieved; no filler.
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 21 fully documented parameters and an output schema, the description supplies the remaining semantic guardrails (amendments, item-level matching, donation-vs-report counting). It does not explain pagination/cursor interaction with max_pages across calls, which is the main residual gap.
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 parameters are already documented; the description only reinforces the 'same item' semantics of the amount predicates and the availability of parent lists, which the schema descriptions largely repeat. 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?
States a specific verb and resource ('Retrieve complete semiannual LD-203 reports, contributions, PAC relationships and certifications'), which is clearly distinct from search_filings or get_issue_spending. It does not name a sibling or explicitly contrast with one, so it stops short of a 5.
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?
Usage is implied by the resource (LD-203 contribution retrieval) and the caveats steer interpretation, but there is no explicit when-to-use vs. when-to-use-an-alternative guidance against the eight sibling tools. Nothing tells the agent whether to prefer this over search_filings for a given question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_get_issue_spendingUslobbying Get Issue SpendingARead-onlyIdempotentInspect
Aggregate separate income and expense amounts on quarterly filings mentioning issue_code across explicit years. This is whole-filing association, not allocated issue spending; issue buckets overlap. All versions are acquired before latest-period selection and local issue filtering. Broad scans can take hours; narrow client_id or registrant_id when appropriate. Follow collecting cursors before interpreting final typed rows or SQL datasets. Pass a selected filing UUID to uslobbying_search_filings for its complete record.
| Name | Required | Description | Default |
|---|---|---|---|
| years | No | Required explicit analytical year scope; sorted and deduplicated. | |
| cursor | No | Continue the original scope; other query fields may be omitted. | |
| row_sets | No | Inline analytical sets; omit for all sets. Selection never limits acquisition, totals or SQL staging. Omitted sets remain available from a new call with another selection or staged tables. Continue with omitted or equivalent row_sets. | |
| canvas_id | No | Reuse this canvas only after complete analytical acquisition. | |
| client_id | No | Optional client relationship record ID from candidates[].id in uslobbying_get_client_profile resolve mode; candidates[].client_id is secondary. | |
| max_pages | No | Source pages per call; positive integers clamp to five, default one for discovery, five for analysis. | |
| page_size | No | Upstream rows per page; positive integers clamp to 25, default 25. | |
| issue_code | No | Required first-call code from uslobbying_list_reference topic issue_codes. | |
| record_path | No | JSON Pointer to a stored value; empty selects the root. | |
| record_limit | No | Maximum object entries or array items, clamped to 25; text fragments use the response byte budget. | |
| record_handle | No | Tenant/tool-bound deferred record handle. | |
| record_offset | No | Key, item or Unicode-code-point offset. | |
| registrant_id | No | Optional native registrant scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| firms | No | Firm breakdowns in this window. |
| years | No | Explicit requested years. |
| offset | No | Final record delivery offset. |
| source | No | Official source system. |
| status | No | Source acquisition status, separate from row delivery. |
| dataset | No | Complete SQL metadata on the first final window and its replay. |
| notices | No | Limitations and success notices. |
| coverage | No | Acquisition progress, independent of delivery. |
| guidance | No | Table names and dataframe instructions. |
| canvas_id | No | Tenant-scoped canvas access token. |
| truncated | No | More data is available through next_cursor or record_handles; no source data was discarded. |
| activities | No | Selected activities in this window; no money columns. |
| issue_code | No | Requested issue membership code. |
| query_tool | No | Query or retrieve materialized table rows. |
| selections | No | Version-selection decisions in this window. |
| attribution | No | Required verbatim attribution for LDA data. |
| issue_codes | No | Overlapping issue breakdowns in this window. |
| methodology | No | Accounting limitations. |
| next_cursor | No | Next acquisition or output window cursor. |
| raw_filings | No | All acquired versions in this window, including selected versions. |
| retrieved_at | No | Retrieval ISO timestamp. |
| describe_tool | No | Inspect exact table schemas before SQL. |
| record_window | No | Lossless stored parent window. |
| total_records | No | Exact final record count when known. |
| annual_ledgers | No | Complete-year ledgers in this window; absent while collecting. |
| record_handles | No | Deferred complete parents. |
| retrieval_tool | No | Tool that retrieves this parent. |
| row_set_totals | No | Exact all-set totals after acquisition completes. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| output_complete | No | Whether all result rows have been delivered. |
| row_set_offsets | No | Selected-set rows delivered or deferred before this window; others zero. |
| canvas_available | No | SQL canvas support is enabled. |
| records_deferred | No | Oversized parents available through handles. |
| records_returned | No | Complete records delivered in this window. |
| selected_filings | No | Complete selected filings in this window. |
| attribution_basis | No | Whole filings mentioning an issue; buckets overlap. |
| cursor_expires_at | No | Continuation expiry ISO timestamp. |
| effective_filters | No | Normalized effective scope. |
| targeted_entities | No | Targeted entities in this window. |
| snapshot_source_urls | No | Official snapshot URLs. |
| snapshot_retrieved_at | No | FARA snapshot retrieval timestamp. |
| snapshot_last_modified | No | Upstream Last-Modified header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent, but the description adds substantive behavior: whole-filing association rather than allocated amounts, overlapping issue buckets, all versions acquired before latest-period selection and local issue filtering, and a real latency warning ('can take hours'). The cursor instruction ('follow collecting cursors before interpreting final typed rows or SQL datasets') discloses a non-obvious execution contract that would otherwise cause misreads.
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?
Purpose and the key caveat are front-loaded in the first two sentences, then performance, cursor, and handoff notes follow in priority order. It is dense but every sentence carries operational information; only the repeated references to versions/cursors verge on redundancy.
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 13-parameter aggregation tool with an output schema and full annotation coverage, the description supplies the remaining load-bearing context: association semantics, overlap caveat, latency, cursor discipline, and cross-tool handoffs. An agent has enough to call it correctly and to interpret the results without over-reading them as allocated issue spending.
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 the baseline is 3, but the description adds meaning the schema does not: years is an explicit analytical scope, issue_code must come from uslobbying_list_reference topic issue_codes on the first call, and client_id should be resolved from uslobbying_get_client_profile candidates. The cursor guidance further frames how row_sets and continuation interact with acquisition and totals.
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 first sentence names a specific verb (aggregate) and resource (income/expense amounts on quarterly filings keyed to issue_code across explicit years). It immediately disambiguates the semantics with 'whole-filing association, not allocated issue spending; issue buckets overlap', which no sibling would claim. The handoff sentence to uslobbying_search_filings clarifies the boundary against that sibling.
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?
It gives concrete operating advice: 'Broad scans can take hours; narrow client_id or registrant_id when appropriate', and tells the agent to pass a selected filing UUID to uslobbying_search_filings for the complete record. That covers when to narrow and where to escalate, but there is no explicit when-not-to-use versus siblings like uslobbying_get_contributions or uslobbying_dataframe_query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_list_referenceUslobbying List ReferenceARead-onlyIdempotentInspect
List official issue codes, filing types, government entities, contribution types and countries, or explain identifiers, methodology and FARA rules. Optional filter performs case-insensitive literal token-AND matching across the complete vocabulary. Follow next_cursor for pinned result windows; retrieve oversized entries with this tool using record_handle and record_path. Countries include separately attributed LDA codes and FARA source labels; FARA labels are not guessed ISO codes.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Vocabulary or explanatory topic; required on the first call. | |
| cursor | No | Pinned continuation; omit original topic/filter or repeat them unchanged. | |
| filter | No | Every whitespace-separated token must occur literally in an entry. | |
| record_path | No | JSON Pointer to a stored value; empty selects the root. | |
| record_limit | No | Maximum object entries or array items, clamped to 25; text fragments use the response byte budget. | |
| record_handle | No | Tenant/tool-bound deferred record handle. | |
| record_offset | No | Key, item or Unicode-code-point offset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| topic | No | Requested vocabulary. |
| offset | No | Start position in the pinned filtered vocabulary. |
| entries | No | Complete entries delivered in this pinned vocabulary window. |
| notices | No | Source limitations and empty-result recovery. |
| truncated | No | More entries or deferred record values remain retrievable. |
| next_cursor | No | Opaque continuation of the pinned vocabulary. |
| source_urls | No | Official source references. |
| retrieved_at | No | Vocabulary retrieval timestamp. |
| record_window | No | Exact recursive window of a deferred vocabulary entry. |
| total_entries | No | Entries before local filtering. |
| record_handles | No | Oversized entries retrievable through this same tool. |
| retrieval_tool | No | Tool used to retrieve deferred vocabulary entries. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| matched_entries | No | Entries matching every literal filter token. |
| output_complete | No | Every matched entry has been delivered or deferred. |
| records_deferred | No | Oversized entries retained behind handles. |
| records_returned | No | Complete entries delivered in this window. |
| cursor_expires_at | No | Absolute expiry of retained entries and continuations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/idempotent/closed-world, but the description adds substantial behavior: cursor results are 'pinned windows' that ignore or repeat the original topic/filter, oversized values must be fetched back through this same tool via record_handle + record_path, and countries mix LDA codes with non-ISO FARA source labels that are explicitly not normalized. These are exactly the non-obvious traits an agent would otherwise get wrong.
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?
Four front-loaded sentences, each carrying distinct information (scope, filter semantics, paging/overflow mechanics, data caveat) with no filler. Density is high but justified; a slightly clearer split between the list vs. explain modes would improve scanability.
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 an output schema present, return shapes need not be explained. All seven parameters are fully documented in-schema, and the description closes the remaining gaps (continuation semantics, overflow retrieval, country-code caveat) for what is otherwise a fairly complex paging-plus-reference 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 coverage is 100%, so the baseline is 3; the description still adds relational meaning the schema does not spell out, namely that record_handle and record_path are used together on this tool to unpack oversized entries, and that cursor payloads override or repeat topic/filter. It does not add format detail for record_path (JSON Pointer) or record_offset, which the schema already carries.
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 names a specific verb (list / explain) and enumerates the exact resource set: issue codes, filing types, government entities, contribution types, countries, plus explanatory topics. This vocabulary-topic framing cleanly distinguishes it from all siblings, which are search/get tools over filings and agents.
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?
It gives clear operating context: filter is optional and does token-AND literal matching, cursors drive continuation, and record_handle/record_path are for oversized entries. It stops short of naming alternatives or stating when not to use it (e.g., use search_filings rather than this reference tool for record lookups).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_search_filingsUslobbying Search FilingsARead-onlyIdempotentInspect
Search federal lobbying registrations and activity reports, or retrieve a complete filing by filing_uuid from evidence or analytical selections. Native filters include posting dates, reported amounts, client location and foreign entities; issue_code filters activities locally and cannot narrow upstream requests. Follow next_cursor for all versions. Amounts are separate nullable USD strings; disclosure text is untrusted record data.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Continue the original scope; other query fields may be omitted. | |
| client_id | No | Client relationship record ID from candidates[].id in uslobbying_get_client_profile resolve mode; candidates[].client_id is secondary. | |
| max_pages | No | Source pages per call; positive integers clamp to five, default one for discovery, five for analysis. | |
| page_size | No | Upstream rows per page; positive integers clamp to 25, default 25. | |
| amount_max | No | Native maximum reported filing amount, exact decimal USD with at most two fractional digits. | |
| amount_min | No | Native minimum reported filing amount, exact decimal USD with at most two fractional digits. | |
| issue_code | No | Local activity membership code from topic issue_codes. | |
| client_name | No | Literal client name upstream search. | |
| filing_type | No | Official code from uslobbying_list_reference topic filing_types. | |
| filing_uuid | No | Exact filing UUID from evidence or analytical selections; retrieves complete source records. | |
| filing_year | No | Reported year, 1999 through the current UTC year. | |
| lobbyist_id | No | Lobbyist ID. | |
| record_path | No | JSON Pointer to a stored value; empty selects the root. | |
| client_state | No | Native client state code, normalized uppercase. | |
| posted_after | No | Earliest native filing posting calendar date. | |
| record_limit | No | Maximum object entries or array items, clamped to 25; text fragments use the response byte budget. | |
| filing_period | No | Source reporting period. | |
| lobbyist_name | No | Native disclosed lobbyist name search. | |
| posted_before | No | Latest native filing posting calendar date. | |
| record_handle | No | Tenant/tool-bound deferred record handle. | |
| record_offset | No | Key, item or Unicode-code-point offset. | |
| registrant_id | No | Registrant ID. | |
| client_country | No | Native client country code, normalized uppercase. | |
| registrant_name | No | Literal registrant name upstream search. | |
| specific_issues | No | Search the disclosed specific-issues text, such as H.R. 1 or telecommunications. | |
| foreign_entity_name | No | Native disclosed foreign entity name search. | |
| foreign_entity_country | No | Native foreign entity country code, normalized uppercase. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| offset | No | Final record delivery offset. |
| source | No | Official source system. |
| filings | No | Complete matched source filings. |
| notices | No | Limitations and success notices. |
| coverage | No | Acquisition progress, independent of delivery. |
| truncated | No | More of the parent value remains available through record windows. |
| attribution | No | Required verbatim attribution for LDA data. |
| next_cursor | No | Next acquisition or output window cursor. |
| retrieved_at | No | Retrieval ISO timestamp. |
| record_window | No | Lossless stored parent window. |
| total_records | No | Exact final record count when known. |
| record_handles | No | Deferred complete parents. |
| retrieval_tool | No | Tool that retrieves this parent. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| output_complete | No | Whether all result rows have been delivered. |
| amendment_policy | No | Originals and amendments remain separate. |
| records_deferred | No | Oversized parents available through handles. |
| records_returned | No | Complete records delivered in this window. |
| cursor_expires_at | No | Continuation expiry ISO timestamp. |
| effective_filters | No | Normalized effective scope. |
| snapshot_source_urls | No | Official snapshot URLs. |
| snapshot_retrieved_at | No | FARA snapshot retrieval timestamp. |
| snapshot_last_modified | No | Upstream Last-Modified header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds value beyond that: amounts are separate nullable USD strings (not one aggregate), disclosure text is untrusted record data (a prompt-injection warning), and issue_code is applied post-fetch rather than upstream. It does not cover rate limits or page-budget interaction with max_pages.
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?
Four sentences, front-loaded with the primary capability before filter details and caveats. Dense and telegraphic in places ('Native filters include posting dates, reported amounts, client location and foreign entities'), but essentially every clause carries operational information.
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 27 optional parameters, an output schema, and full schema descriptions, the description supplies the remaining pieces an agent needs: the two invocation modes, cursor-based paging, local-vs-native filtering, and data-trust caveats. Paging budget behavior (max_pages/page_size defaults and clamps) is left entirely to the schema, which is a minor gap.
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 the baseline is 3; the description earns above that by explaining filter semantics the schema does not, specifically that issue_code filters activities locally and cannot narrow upstream requests, and that amounts are separate nullable strings. Several parameter groups (paging, record_*) are only described 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?
States a specific verb and resource ('Search federal lobbying registrations and activity reports') plus a second mode ('retrieve a complete filing by filing_uuid'). The two-mode structure lets an agent distinguish search vs. fetch, but it never names or contrasts the nearby siblings such as uslobbying_search_lobbyists or uslobbying_search_foreign_agents.
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?
Gives real routing context: filing_uuid mode is for retrieving complete records from evidence or analytical selections, and 'Follow next_cursor for all versions' tells the agent how to page to completion. It also warns that issue_code filters locally and cannot narrow upstream requests, which prevents a wrong usage pattern. Missing only explicit when-not-to-use guidance against sibling search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_search_foreign_agentsSearch foreign agentsARead-onlyIdempotentInspect
Search official FARA daily registrant or foreign-principal snapshots, or retrieve one registration principal, short-form or document collection. Follow cursors to pinned local windows; principal status differs from registrant status. Disclosure records do not establish wrongdoing or influence.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Search daily snapshots or fetch one registration detail collection; defaults to search. | |
| cursor | No | Opaque continuation; original filters may be omitted or repeated unchanged. | |
| detail | No | Detail collection, default foreign_principals; unavailable in search mode. | |
| entity | No | Search entity, default registrants; unavailable in detail mode. | |
| status | No | Selected entity status, default active; documents require all. | |
| country | No | Exact represented country/location label, foreign-principal search only. | |
| page_size | No | Maximum records in one local output window; positive integers clamp to 25, default 25. | |
| record_path | No | JSON Pointer to a stored value; empty selects the root. | |
| record_limit | No | Maximum object entries or array items, clamped to 25; text fragments use the response byte budget. | |
| name_contains | No | Search-only literal case-insensitive token-AND match over entity names. | |
| record_handle | No | Opaque tenant/tool-bound deferred record handle; exclusive with source selectors and cursor. | |
| record_offset | No | Key, item or Unicode-code-point offset. | |
| registration_number | No | Lossless digit-string registration number, required for detail mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | Original acquisition mode. |
| error | No | Present when the call failed. Absent on success. |
| detail | No | Selected detail collection. |
| entity | No | Selected search entity. |
| offset | No | Start position in the pinned result set. |
| source | No | Official source system. |
| status | No | Effective selected entity status. |
| notices | No | Limitations and success notices. |
| records | No | Complete normalized parent records delivered in this window. |
| coverage | No | Acquisition progress, independent of delivery. |
| truncated | No | More data is available through next_cursor, record_handles or record windows; no source data was discarded. |
| attribution | No | Required verbatim attribution for LDA data. |
| next_cursor | No | Opaque next local result window. |
| source_urls | No | Official source URLs actually acquired. |
| retrieved_at | No | Retrieval ISO timestamp. |
| record_window | No | Exact recursive window of a retained parent. |
| total_matches | No | Exact matched records in the pinned acquisition. |
| record_handles | No | Retained oversized parents, excluded from full records delivered. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| output_complete | No | Whether every matched parent has been delivered or deferred. |
| records_deferred | No | Oversized parents represented by handles. |
| records_returned | No | Full records delivered in this window. |
| cursor_expires_at | No | Continuation expiry ISO timestamp. |
| effective_filters | No | Normalized effective scope. |
| snapshot_source_urls | No | Official snapshot URLs. |
| snapshot_retrieved_at | No | FARA snapshot retrieval timestamp. |
| snapshot_last_modified | No | Upstream Last-Modified header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and open-world behavior, yet the description adds real context: cursors bind to pinned local windows (so filter resubmission matters), status semantics vary by entity, and disclosure records carry no implication of wrongdoing. It omits any mention of the deferred record_handle workflow, but against annotation coverage this is a solid additive contribution.
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 compact sentences with the mode distinction front-loaded and no filler. Some phrasing is opaque jargon ('pinned local windows', 'retrieve one registration principal, short-form or document collection') that costs a little clarity for its density.
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 13 parameters, an output schema and full annotation coverage, the description handles the primary search/detail split, cursors and status caveats adequately. However, the deferred record_handle / record_path / record_offset retrieval pattern — a non-obvious two-phase workflow for this tool — gets no mention at all, leaving a meaningful gap for a tool of this complexity.
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 the baseline is 3, but the description adds genuine semantic meaning beyond the schema: that cursor continuation is pinned to a local window and that identical status values mean different things for registrants vs foreign principals. Navigation parameters (record_path, record_offset, record_limit) are left entirely to 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?
States specific verbs (search / retrieve) and specific resources (FARA daily registrant or foreign-principal snapshots, registration detail collections), which lets an agent distinguish this FARA-oriented tool from the lobbying-focused siblings like search_filings and search_lobbyists. It never names those siblings explicitly, so differentiation is implicit rather than stated.
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 FARA/disclosure framing implies when the tool applies, and 'principal status differs from registrant status' hints at a selection consideration. But there is no explicit when-to-use vs when-to-use-an-alternative guidance, and nothing routes the agent between this tool and the sibling search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uslobbying_search_lobbyistsUslobbying Search LobbyistsARead-onlyIdempotentInspect
Find lobbyists by name or registrant in mode search, then retrieve filing-scoped evidence with mode activity, lobbyist_id and filing_year. Pass an evidence filing_uuid to uslobbying_search_filings for the complete filing. Covered positions are disclosed text, not verified present employment. Activity mode checks the requested lobbyist locally. Follow next_cursor for all results.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | search (default) finds identities by name or registrant; activity requires lobbyist_id and filing_year. Omit with cursor. | |
| name | No | Lobbyist identity name substring. | |
| cursor | No | Continue the original scope; other query fields may be omitted. | |
| client_id | No | Optional activity client relationship record ID from candidates[].id in uslobbying_get_client_profile resolve mode; candidates[].client_id is secondary. | |
| max_pages | No | Source pages per call; positive integers clamp to five, default one for discovery, five for analysis. | |
| page_size | No | Upstream rows per page; positive integers clamp to 25, default 25. | |
| filing_year | No | Required report year in activity mode. | |
| lobbyist_id | No | Required in activity mode. | |
| record_path | No | JSON Pointer to a stored value; empty selects the root. | |
| record_limit | No | Maximum object entries or array items, clamped to 25; text fragments use the response byte budget. | |
| record_handle | No | Tenant/tool-bound deferred record handle. | |
| record_offset | No | Key, item or Unicode-code-point offset. | |
| registrant_id | No | Registrant identity ID. | |
| registrant_name | No | Registrant identity name substring. | |
| covered_positions_only | No | Activity only: require this lobbyist’s nonblank covered-position disclosure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | Resolved operation. |
| error | No | Present when the call failed. Absent on success. |
| offset | No | Final record delivery offset. |
| source | No | Official source system. |
| notices | No | Limitations and success notices. |
| coverage | No | Acquisition progress, independent of delivery. |
| evidence | No | Matched filing-based participant evidence in activity mode. |
| lobbyists | No | Complete identity records in search mode. |
| truncated | No | More of the parent value remains available through record windows. |
| attribution | No | Required verbatim attribution for LDA data. |
| next_cursor | No | Next acquisition or output window cursor. |
| retrieved_at | No | Retrieval ISO timestamp. |
| record_window | No | Lossless stored parent window. |
| total_records | No | Exact final record count when known. |
| record_handles | No | Deferred complete parents. |
| retrieval_tool | No | Tool that retrieves this parent. |
| delivery_limits | No | Clamped controls for this call; an empty map means no clamp. Immediate cursor replay retains its original values. |
| output_complete | No | Whether all result rows have been delivered. |
| records_deferred | No | Oversized parents available through handles. |
| records_returned | No | Complete records delivered in this window. |
| cursor_expires_at | No | Continuation expiry ISO timestamp. |
| effective_filters | No | Normalized effective scope. |
| snapshot_source_urls | No | Official snapshot URLs. |
| snapshot_retrieved_at | No | FARA snapshot retrieval timestamp. |
| snapshot_last_modified | No | Upstream Last-Modified header. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover read-only, open-world, and idempotent behavior, and the description adds useful caveats: covered positions are disclosed text rather than verified employment, activity mode checks the requested lobbyist locally, and cursors should be followed. It does not discuss rate limits or auth requirements, but the annotation set reduces that burden.
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 dense but front-loaded and free of filler. The caveat about covered positions is relevant, though the overall wording is somewhat compressed and could be easier to scan.
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 rich input schema, annotations, and output schema, the description supplies the key operational context an agent needs: mode selection, required activity inputs, filing handoff, disclosure caveat, and pagination behavior.
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 the schema already defines all 15 parameters. The description still adds cross-parameter meaning by explaining mode-dependent requirements and the cursor-based continuation pattern, which goes beyond isolated schema 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?
The description gives a specific verb and resource, "Find lobbyists by name or registrant," and clearly separates the two operating modes, search and activity. It also distinguishes this from uslobbying_search_filings by explaining the handoff for complete filings.
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?
It states that search is the default mode and that activity requires lobbyist_id and filing_year, and it names uslobbying_search_filings as the alternative for complete filing evidence. It does not explicitly describe when not to use this tool versus other siblings such as uslobbying_get_client_profile.
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.
9 tool updates
- First observed
uslobbying_dataframe_describe - First observed
uslobbying_dataframe_query - First observed
uslobbying_get_client_profile - First observed
uslobbying_get_contributions - First observed
uslobbying_get_issue_spending - First observed
uslobbying_list_reference - First observed
uslobbying_search_filings - First observed
uslobbying_search_foreign_agents - First observed
uslobbying_search_lobbyists
Related MCP Connectors
Access U.S. congressional data (bills, votes, members, committees) via MCP.
Federal and state lobbying data: who lobbies for whom, spending, bills, agencies. From LDA filings.
US Senate Lobbying Disclosure (LDA) MCP.
Search ReliefWeb humanitarian reports, disasters, jobs, training, and country profiles via MCP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceSearch bills, legislators, committees, and events across all 50 US states, DC, and 5 US territories via MCP.115 npm2Apache 2.0
- FlicenseNot gradedqualityCmaintenanceQuery normalized U.S. House and Senate STOCK Act disclosures, member trading histories, and aggregate trading statistics through MCP.-
- AlicenseNot gradedqualityAmaintenanceSearch and trace US federal rules across the Federal Register (proposed/final rules and notices), the eCFR (codified, point-in-time CFR full text, locally mirrored), and Regulations.gov (rulemaking dockets and public comments) via MCP.88 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceQuery SEC EDGAR filings, XBRL financials, and company data through MCP.468 npm11Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.