Skip to main content
Glama
cliwant

mcp-sam-gov

by cliwant

@cliwant/mcp-sam-gov

$4 trillion of public federal data, one npm install away.

The most comprehensive keyless-first MCP server for US federal and state/local (SLED) contracting + spending + regulation + partner vetting. 150 tools across 52 data sources — keyless-first: only 4 sources (Census business-patterns, FRED, BEA, and DOL's data endpoint) need a free key; the other 48 need none. Works today, in any AI agent.

npm mcp-registry Glama score License: MIT Daily smoke

English · 한국어 · 日本語


See it in action

👤  user        Find active SAM.gov solicitations under NAICS 541512 closing this month
                                                                                          
🤖  Claude     → sam_search_opportunities { ncode: "541512", limit: 5 }                  
✓  47,478 active opportunities indexed                                                  
                                                                                          
   • 5ef3db5d…  VA Bulk Oxygen Tank Rental         closes 2026-05-15  ($1.05M)         
   • a000339c…  Articulating Boom Lifts             closes 2026-05-30  ($310K)          
   • be9c24ef…  CMOP Hazardous Waste Removal        closes 2026-06-12  ($2.7M)          

👤  user        Pull the SOW + contracting officer for the first one
                                                                                          
🤖  Claude     → sam_get_opportunity { noticeId: "5ef3db5d…" }                          
✓  Department of Veterans Affairs · Combined Synopsis/Solicitation                       
   POC:           Rebecca Gobble  <rebecca.gobble@va.gov>  +1-410-642-2411                 
   Set-aside:     Total Small Business                                                    
   Attachments:   1   ↓ 36C24526Q0460_1.docx (172 KB)                                     
   SOW preview:   "RFQ# 36C24526Q0460 — Bulk Oxygen Tank Rental, Fill, Telemetry…"        

Zero API key. Zero registration. Zero signup. Just plug it in and ask.


Related MCP server: USA Spending MCP Server

Why this exists

Status quo

With this MCP

GovWin: $30K-$100K/yr per seat

Free, MIT license

API key registration → wait 24h → quota tier shopping

npm install → working in 60s

5+ separate vendor APIs / scrapers

1 unified surface, 150 tools across 52 sources

LLMs hallucinate NAICS codes / agency names

Anti-hallucination autocomplete guards built-in

Brittle scraping breaks weekly

Daily live smoke test (badge above)

Procurement officer → IT ticket → 3-week wait

Claude Desktop double-click install

The federal data this wraps is public domain. There is no good reason it should cost a five-figure subscription to query.


What this gives Claude (and other AI agents)

Domain

What you can ask

Sources

🔍 Opportunities & solicitations

"Find SAM.gov solicitations under NAICS 541512 closing this month" — read the SOW, POCs, attachments

SAM.gov, Grants.gov

💰 Spending, awards & competition

"Show me Booz Allen wins at VA last fiscal year; top 10 PSC categories at DoD"

USAspending, FPDS, GAO

🕵️ Entity & partner vetting

"Screen this firm: OFAC sanctions, SAM exclusions, single-audit findings, bank health, EPA compliance + toxics-release"

OFAC, SAM, FAC, FDIC, EPA ECHO, EPA Envirofacts

🛒 Product safety & recalls

"Any FDA/NHTSA/CPSC recalls or enforcement against this supplier's products?"

openFDA, NHTSA, CPSC

⚖️ Litigation & courts

"Any Court of Federal Claims bid protests or Federal Circuit opinions involving this contractor?"

CourtListener (Free Law Project)

🏢 Nonprofit vendors

"Pull this nonprofit's IRS-990 financials before we subcontract to it"

IRS 990 (via ProPublica)

🏥 Healthcare providers & facilities

"Medicare utilization & payments for this provider; hospital quality ratings; is this provider on the revocation list?"

CMS (data.cms.gov)

📈 Financial disclosure (SEC)

"Pull this public company's revenue trend and latest 10-K filings"

SEC EDGAR

⚖️ Regulatory & legislative

"What VA cybersecurity rules were published this quarter? Any open Regulations.gov dockets?"

Federal Register, Regulations.gov, eCFR, FAR/DFARS, Congress.gov, GovInfo

💲 Pricing, labor & fiscal

"GSA CALC labor-rate band for a systems analyst; SCA wage determination for this county; CPI escalation; per-diem cap for a trip; regional GDP by industry; DOL wage-hour enforcement history"

GSA CALC, SAM WDs, BLS, US Census CBP, FRED, BEA, US Treasury, GSA per-diem, US DOL

🏛 Lobbying & influence

"Who lobbies the VA on cybersecurity, and how much do they spend?"

US Senate LDA

🏥 Health & research funding

"NIH/NSF grants on this topic; recruiting clinical trials; industry payments to this physician"

NIH RePORTER, NSF, ClinicalTrials.gov, CMS Open Payments, NPPES

🛡 Cyber compliance

"Is this CVE on the CISA KEV must-patch list?"

NVD, CISA KEV

🌐 Trade, geo & disaster

"HTS tariff for this product; Census tract for this address; FEMA declarations in this state"

USITC HTS, US Census, FEMA, Socrata, CKAN

🏙 State/local procurement bids (SLED)

"What's open on this city's/county's procurement portal right now? Their checkbook, awarded contracts, vendor payments; state DOT bid/award registers"

OpenGov Procurement (525+ govs), Bonfire, ArcGIS (feature + Hub), Socrata (53 hosts)

🎓 Grants & datasets

"Cybersecurity grants posted in the last 30 days; discover federal open datasets"

Grants.gov, data.gov

150 tools across 52 data sources — keyless-first: only 4 sources (Census business-patterns, FRED, BEA, and DOL's data endpoint) need a free key; the other 48 need none. (An earlier 52-tool build measured roughly p50 ~0.25s / p95 ~0.8s against production federal APIs; latency varies by source and upstream load — treat it as fast, not a benchmarked guarantee.)


How do I install it? Pick the path that matches you.

🟢 Path 1 — Claude Desktop, one-click (no terminal needed)

Best for non-developers. Just download a file and double-click.

  1. Download mcp-sam-gov.mcpb from the latest release.

  2. Double-click the file. Claude Desktop opens with an "Install Extension" dialog.

  3. Click Install.

  4. Done. Start a new conversation and ask "Find active SAM.gov opportunities under NAICS 541512".

That's it. No PowerShell, no npm, nothing.

Requires Claude Desktop ≥ 1.0 (which ships its own Node.js runtime).

🟡 Path 2 — Claude Code, one command

If you already use Claude Code (the CLI):

/plugin install cliwant/mcp-sam-gov

This installs the MCP server plus a SKILL.md workflow guide that teaches Claude when + how to use each of the 150 tools.

🔵 Path 3 — Manual install for any MCP host (Codex, Cursor, Continue, Gemini)

For Codex CLI / Cursor / Continue / Gemini CLI / anything that speaks MCP:

gh repo clone cliwant/mcp-sam-gov
cd mcp-sam-gov
npm install --omit=dev
npm install -g .

After install, the binary mcp-sam-gov is on your PATH. Add this to your host config:

{
  "mcpServers": {
    "sam-gov": {
      "command": "mcp-sam-gov"
    }
  }
}

Specific config locations per host: see Host configurations below.

⚪ Path 4 — Direct path (zero install, just point at the file)

Skip installation entirely:

gh repo clone cliwant/mcp-sam-gov
cd mcp-sam-gov
npm install --omit=dev   # only runtime deps; dist/ is pre-built

Then point your host config at the absolute path:

{
  "mcpServers": {
    "sam-gov": {
      "command": "node",
      "args": ["C:\\Users\\you\\mcp-sam-gov\\dist\\server.js"]
    }
  }
}

Host configurations

Claude Desktop

%APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "sam-gov": { "command": "mcp-sam-gov" }
  }
}

(Or skip this entirely — use Path 1's .mcpb and it auto-configures.)

Restart Claude Desktop fully (system tray quit on Windows / Quit menu on macOS), then look for the 🔨 icon. You should see "sam-gov (150 tools)".

Claude Code

Per-project .mcp.json:

{ "mcpServers": { "sam-gov": { "command": "mcp-sam-gov" } } }

Or globally:

claude mcp add sam-gov mcp-sam-gov

Codex CLI

~/.codex/config.toml:

[mcp_servers.sam-gov]
command = "mcp-sam-gov"
args = []

Cursor

Settings → MCP → Add new MCP server:

{ "mcpServers": { "sam-gov": { "command": "mcp-sam-gov" } } }

Continue

~/.continue/config.json:

{
  "experimental": {
    "modelContextProtocolServer": {
      "transport": { "type": "stdio", "command": "mcp-sam-gov" }
    }
  }
}

Gemini CLI

~/.gemini/settings.json:

{ "mcpServers": { "sam-gov": { "command": "mcp-sam-gov" } } }

Anything else

If your host speaks MCP over stdio, point it at mcp-sam-gov. No host-specific code.


What questions can I ask?

Once installed, you can ask in natural language. The agent picks the right tool sequence automatically.

Discovery

  • "NAICS 541512 의 메릴랜드 입찰 중 30일 안에 마감되는 것 찾아줘"

  • "Find active SAM.gov solicitations under NAICS 541512, MD only, closing in 30 days"

  • "What's the canonical NAICS code for 'computer systems design'?"

RFP analysis

  • "Pull noticeId 5ef3db5daeb54099a96d487783a38bd0 — give me the SOW, contracting officer, and attachments"

  • "Show me the full RFP body for that notice"

Competitive landscape

  • "Top 5 recipients of VA contracts in NAICS 541519 last fiscal year"

  • "Show me Booz Allen's individual awards at DISA"

  • "Who are the sub-contractors on Leidos' VA contracts?"

  • "What's CMS in USAspending? (resolve the abbreviation)"

  • "How has VA 541512 spending trended over the last 5 fiscal years?"

  • "Top 10 states by federal contracting spend in 541512"

  • "Top PSC categories at DoD by spending"

  • "Federal grant programs in cybersecurity by total $"

Agency intelligence (capture brief)

  • "Give me a capture brief on VA: mission, FY26 budget breakdown, top sub-agencies"

  • "What's VA's transaction volume for FY25?"

Recompete radar

  • "VA 541512 contracts expiring in next 12 months over $1M"

  • "Pull period of performance for award CONT_AWD_..."

Regulatory & legislative

  • "Find FAR sections about SDVOSB set-aside requirements"

  • "Turn this RFP's cited FAR/DFARS clause list into a Section L/M compliance matrix"

  • "What new VA cybersecurity rules were published this quarter?"

  • "Any Federal Register documents on the public-inspection desk from DoD today?"

  • "Search Regulations.gov dockets on 'contractor cybersecurity' and pull the public comments"

  • "Discover federal open datasets about 'wildfire' on data.gov"

  • "Is there a Federal Register doc number 2026-08333? Pull the citation."

Partner & entity vetting

  • "Screen 'Acme Defense LLC' against the OFAC sanctions list and SAM exclusions"

  • "Look up NPI 1234567890 in NPPES — is this provider active?"

  • "Does this subcontractor have adverse Single Audit findings in the Federal Audit Clearinghouse?"

  • "How healthy is the bank on cert #3510 — risk ratios and quarterly financials?"

  • "Pull this public company's revenue trend and latest 10-K from SEC EDGAR"

  • "Any EPA compliance/enforcement flags for this facility?"

Compliance & eligibility

  • "What's the SBA small-business size standard for NAICS 541512?"

  • "Search the eCFR for the exact text of a rule"

  • "What's the US import duty rate (HTS) for lithium-ion batteries?"

Pricing, labor & fiscal

  • "GSA CALC ceiling-rate band for a senior systems analyst"

  • "Find the SCA wage determination for Baltimore County, MD and give me the fringe rates"

  • "How much has CPI-U risen over the last 3 years for an escalation clause?"

  • "What's the current total US public debt (Debt to the Penny)?"

Cyber

  • "Is CVE-2021-44228 (Log4Shell) on the CISA KEV must-patch list, and what's the due date?"

Health & research funding

  • "NIH RePORTER projects on mRNA vaccines funded last year"

  • "Recruiting clinical trials for diabetes sponsored by industry"

  • "Industry payments to physicians in CA from the CMS Open Payments Research dataset"

Grants

  • "Cybersecurity grants posted in the last 30 days"

  • "Pull grant id 361238"


Optional — higher rate limits + archives

The MCP server runs keyless by default. For higher SAM.gov rate limits + the full archive (notices older than ~12 months), set SAM_GOV_API_KEY in your host's env block:

{
  "mcpServers": {
    "sam-gov": {
      "command": "mcp-sam-gov",
      "env": { "SAM_GOV_API_KEY": "your-key-here" }
    }
  }
}

Get a free key at sam.gov/SAM/pages/public/searchKeyData.jsf. The agent doesn't need to know — the key path is transparent.

DATA_GOV_API_KEY — the api.data.gov / api.gsa.gov family

A handful of sources ride the shared api.data.gov gateway — Congress.gov, GovInfo, Regulations.gov, FAC, NPPES, and the data.gov v4 dataset catalog. They work keyless out of the box via the public DEMO_KEY (a low shared hourly quota). Set DATA_GOV_API_KEY to raise those limits substantially:

{
  "mcpServers": {
    "sam-gov": {
      "command": "mcp-sam-gov",
      "env": { "DATA_GOV_API_KEY": "your-key-here" }
    }
  }
}

Get one free (instant, no wait) at api.data.gov/signup. The same key is accepted across all api.data.gov / api.gsa.gov sources. Like the SAM key, it is sent only on the wire (never logged); unset simply means DEMO_KEY. BLS sources similarly accept an optional free BLS_API_KEY to lift their daily quota.

Keys & higher limits — the full inventory

Most tools are keyless. Four sources require a free key — Census (census_business_patterns), FRED (fred_search_series, fred_series_observations), BEA (bea_regional_data), and DOL's data endpoint (dol_get_dataset) — those sources have no keyless tier, so the tool throws without one. (DOL's catalog dol_list_datasets is keyless.) The other keys are optional: they only raise a rate limit or unlock a single filter. Every key below is free.

Env var

Required?

What it unlocks

Free signup

CENSUS_API_KEY

Required

census_business_patterns (no keyless tier — throws without it)

api.census.gov/data/key_signup.html

FRED_API_KEY

Required

the 2 FRED tools (no keyless tier — throw without it)

fred.stlouisfed.org/docs/api/api_key.html

BEA_API_KEY

Required

bea_regional_data (BEA Regional; no keyless tier — throws without it)

apps.bea.gov/API/signup

DOL_API_KEY

Required for data

dol_get_dataset (DOL enforcement records via X-API-KEY; the dol_list_datasets catalog is keyless)

dol.gov/developer

DATA_GOV_API_KEY

Optional

higher limits on all api.data.gov sources (Regulations.gov, FAC, NPPES, CMS, data.gov catalog, GSA per-diem) — lifts the shared DEMO_KEY cap

api.data.gov/signup

SAM_GOV_API_KEY

Optional

authenticated SAM.gov v2 search + the organization-name filter

open.gsa.gov/api/get-opportunities-public-api

LDA_API_KEY

Optional

higher rate limit on lda_search_filings (Senate LDA lobbying; keyless by default)

lda.senate.gov/api/register

BLS_API_KEY

Optional

the BLS v2 tier (~500 queries/day vs keyless ~25/day)

data.bls.gov/registrationEngine

NVD_API_KEY

Optional

a higher NVD rate limit (cve_lookup)

nvd.nist.gov/developers/request-an-api-key

OPENFDA_API_KEY

Optional

higher openFDA rate limit (openfda_enforcement, openfda_device_clearances; both work keyless)

open.fda.gov/apis/authentication

COURTLISTENER_API_TOKEN

Optional

higher CourtListener rate limit (courtlistener_search_opinions; works keyless)

courtlistener.com/help/api/rest

SOCRATA_APP_TOKEN

Optional

higher Socrata throttling limits

evergreen.data.socrata.com/signup

Two ways to set any key — pick one:

  1. Host env block — the "env": { … } object shown in the examples above.

  2. A .env file in the server's working directory — configure your keys once:

    CENSUS_API_KEY=your-key-here
    FRED_API_KEY=your-key-here
    # optional — raise limits / unlock filters
    SAM_GOV_API_KEY=your-key-here

    The server auto-loads .env at startup. A real environment variable always wins over .env (standard precedence), and .env is git-ignored so your keys never get committed.

Ask the server which keys it needs. The keyless api_key_status tool lists every key, whether it's required or optional, the free signup URL + what it unlocks, and whether each is currently configured (a boolean — the key value is never shown). Creating the account at the signup URL is your one manual step; the server automates discovery (api_key_status) and configuration (.env). To confirm a key actually works, call that source's own tool.


Staying up to date

npm doesn't notify installed users of new versions, so the server does — minimally. On startup it makes one anonymous request to the public npm registry for its own latest version and, only if a newer one exists, prints a single line to stderr (e.g. a newer version is available: 1.7.0 → 1.8.0). It sends no usage data (a version check, not telemetry), never touches the protocol's stdout, is non-blocking, and stays silent when you're current.

  • Update: npm i -g @cliwant/mcp-sam-gov@latest — or just restart if your config uses npx @cliwant/mcp-sam-gov@latest.

  • Opt out: set MCP_SAM_GOV_NO_UPDATE_CHECK=1 (or NO_UPDATE_NOTIFIER=1).

  • What changed: the releases page + CHANGELOG.

Found a bug? Want a feature? Report it in one step

This server is built to improve from real usage. Because an AI agent (not a human) calls the tools, the feedback path runs through the agent:

  • On the two "something may be broken" errors — schema_drift (a federal API changed shape) and upstream_unavailable (an outage) — the error envelope carries a report field: a prefilled GitHub issue link your agent can offer you.

  • Or just tell your agent "report a bug" / "this result looks wrong" / "I wish it could do X" — it calls the feedback tool, which returns a prefilled issue link for you to open and submit.

Nothing is ever posted automatically. The server has no token and no account — it only builds the link; you open and submit it. Prefilled links carry only the tool name, error kind, and server version — never your query values. The repo is public, so redact anything sensitive first.

You can also open one directly: New issue — bug / feature / wrong-output templates.

Tool catalog (150 tools)

Grouped by workflow. Keyless-first — most tools need no key; Census business-patterns, FRED, BEA, and DOL's data endpoint require a free key, and a handful of others gain higher limits from an optional free key (noted above). Descriptions are condensed — each tool's own inputSchema carries the full contract and honesty caveats.

  • sam_search_opportunities — keyless HAL search of active SAM.gov contracting opportunities

  • sam_search_shaping — pre-solicitation radar (Sources Sought / Presol / Special Notices before the RFP exists)

  • sam_get_opportunity — full detail by 32-char hex noticeId (POCs + attachments + body)

  • sam_fetch_description — full RFP body as plain text

  • sam_fetch_attachment_text — extract attachment text (RFP / SOW / Q&A / wage tables) from PDF + DOCX + text/HTML

  • sam_attachment_url — build the public download URL for an attachment resourceId

  • sam_lookup_organization — federal-organization id → canonical fullParentPathName

  • sam_lookup_notice_fields — batch-fill nulled naics/set-aside/PoP/deadline for 1–100 noticeIds from the opt-in GSA daily CSV

  • grants_search — Grants.gov federal grant opportunities (financial assistance, distinct from SAM contracts)

  • grants_get_opportunity — full detail for a single grant opportunity by id

  • usas_search_awards — aggregate share-of-wallet at agency × NAICS

  • usas_search_individual_awards — line-item federal contracts (returns generatedInternalId)

  • usas_get_award_detail — full award detail: period of performance, options, set-aside, competition

  • usas_search_awards_by_recipient — every contract a recipient won in an agency × NAICS slice

  • usas_search_subawards — enumerate subcontracts on prime awards (supply chain / teaming)

  • usas_search_recompetes — recompete radar (PoP ending in a window, soonest-first, no silent drops)

  • usas_search_expiring_contractsdeprecated alias of usas_search_recompetes (legacy shape)

  • usas_analyze_incumbent — per-award incumbent + public recompete-pressure hints (labels, not a score)

  • usas_search_teaming_partners — small-business teaming discovery by cert × NAICS × agency, exclusion-screened

  • usas_spending_over_time — contract-spending time series (fiscal_year / quarter / month)

  • usas_search_agency_spending — spending broken down by awarding agency

  • usas_search_subagency_spending — break a parent agency down by sub-agency / office

  • usas_search_psc_spending — spending by Product Service Code (PSC)

  • usas_search_cfda_spending — spending by CFDA grant-program code

  • usas_search_state_spending — spending by state / territory

  • usas_search_federal_account_spending — spending by federal account / Treasury Account Symbol (TAS)

  • usas_search_recipients — recipient list with parent/child hierarchy

  • usas_get_recipient_profile — full recipient detail (UEI, alternate names, totals)

  • usas_get_agency_profile — agency profile by toptier code (mission, abbreviation, website)

  • usas_get_agency_awards_summary — award activity for a fiscal year (transaction count + obligations)

  • usas_get_agency_budget_function — budget-function breakdown for an agency × fiscal year

  • usas_list_toptier_agencies — all toptier agencies + current-FY obligations

  • usas_lookup_agency — resolve 'VA' / 'DHS' → canonical toptier name + 4-digit code

  • usas_autocomplete_naics — anti-hallucination NAICS guard

  • usas_autocomplete_recipient — anti-hallucination recipient guard

  • usas_naics_hierarchy — navigate the NAICS tree (2→4→6) + active-contract count per code

  • usas_glossary — 151 federal-spending terms

  • usas_list_disaster_codes — list Disaster Emergency Fund Codes (DEFC): COVID-19, IIJA/infrastructure, and other emergency-appropriation tags

  • usas_disaster_spending — disaster/emergency-fund spending BY GEOGRAPHY for given DEFCs (which state/county/district captured COVID/IIJA relief money)

  • fpds_search_awards — FPDS-NG federal contract award actions (the authoritative award-action feed)

  • gao_protest_lookup — recent GAO bid-protest decisions from the public Legal-Products RSS feed (recent window only)

  • ofac_screen_entity — keyless OFAC denied-party / sanctions screening

  • sam_check_exclusions — keyless SAM debarment/exclusion screening by name and/or UEI/CAGE

  • sam_integrity_lookup — one-call integrity screen (exclusion verdict + honest FAPIIS pointer)

  • fac_search_audits — Single Audit summaries from the Federal Audit Clearinghouse

  • fac_get_findings — drill into the audit-RISK findings for an entity

  • fdic_search_institutions — search the FDIC-insured-institution directory

  • fdic_institution_financials — quarterly financial time-series for one institution (by cert #)

  • fdic_risk_ratios — counterparty risk ratios for one institution

  • fdic_institution_history — structural-change event log (mergers, charter changes)

  • fdic_branch_deposits — branch-deposit footprint

  • fdic_bank_failures — historical bank failures & assistance transactions

  • fdic_industry_summary — industry & state banking-sector annual aggregates

  • echo_search_facilities — search EPA-regulated facilities by state with compliance/enforcement screening

  • echo_facility_report — EPA ECHO Detailed Facility Report for one facility (by FRS RegistryID)

  • epa_tri_facilities — EPA Envirofacts TRI (Toxics Release Inventory) facilities by state/industry (environmental / ESG vetting)

  • openfda_enforcement — FDA drug / device / food recalls & enforcement actions (product-safety supplier vetting)

  • openfda_device_clearances — FDA 510(k) medical-device clearances (device-maker capability check)

  • openfda_drug_approvals — openFDA Drugs@FDA drug-approval applications (sponsor, approved products, submission/approval history)

  • nhtsa_recalls — NHTSA vehicle recalls by make / model / year

  • nhtsa_complaints — NHTSA vehicle safety complaints by make / model / year

  • cpsc_recalls — CPSC consumer-product recalls (product supplier vetting)

  • courtlistener_search_opinions — US federal court opinions (COFC contract claims / bid protests, Federal Circuit) — data via CourtListener / Free Law Project (disclosed)

  • nonprofit_search — IRS-990 nonprofit search by name / state / NTEE — via ProPublica Nonprofit Explorer (disclosed)

  • nonprofit_financials — IRS-990 nonprofit financials by EIN — via ProPublica Nonprofit Explorer (disclosed)

  • edgar_lookup_cik — resolve a company ticker or name to its 10-digit SEC CIK

  • edgar_company_filings — a company's SEC filings

  • edgar_company_facts — curated XBRL financial facts for a filer

  • edgar_company_concept — one filer × one XBRL concept × the complete reported time-series

  • edgar_xbrl_frames — cross-filer XBRL cross-section (one concept across all filers for a period)

  • edgar_full_text_search — full-text search across EDGAR filings, 2001–present

  • edgar_filing_index — bulk cross-filer filing index for a quarter

  • edgar_daily_filing_index — per-day cross-filer filing index

  • fed_register_search_documents — search Federal Register documents by query / agency / type / date

  • fed_register_get_document — full detail for a document by number (citation, body URL, CFR refs)

  • fed_register_public_inspection — the Federal Register public-inspection desk (pre-publication)

  • fed_register_list_agencies — Federal Register agency slugs reference

  • regulations_search_dockets — search Regulations.gov rulemaking dockets

  • regulations_search_documents — search Regulations.gov rulemaking documents (rules, proposed rules, notices)

  • regulations_search_comments — search public comments on rulemakings

  • regulations_get_docket — fetch one Regulations.gov docket by id

  • ecfr_search — full-text search across the entire CFR (titleNumber=48 for FAR); returns ranked snippets + ecfrUrl

  • ecfr_get_section — the FULL text of one CFR section by citation (any title; for FAR/DFARS prefer far_clause_lookup)

  • ecfr_list_titles — all 50 CFR titles + last-amended dates

  • far_clause_lookup — authoritative FAR/DFARS clause text + its prescription (exact clause number)

  • far_search — FAR/DFARS-scoped search (excludes GSAM, collapses to current in-force version)

  • far_compliance_matrix — cited-clause list → proposal-ready Section L/M compliance matrix (eligibility gates flagged)

  • congress_search_bills — search Congress.gov bills / legislation

  • congress_get_bill — one bill by congress / type / number

  • govinfo_search_packages — search GovInfo (GPO-authoritative) packages in a collection

  • govinfo_get_package — one GovInfo package summary + download links (txt/xml/pdf/mods)

  • govinfo_list_collections — the GovInfo collection catalog

  • gsa_benchmark_labor_rates — GSA CALC awarded ceiling-rate market band for a labor category (a distribution, not one price)

  • sam_search_wage_determinations — find SCA / Davis-Bacon wage determinations for a locality

  • sam_get_wage_rates — prevailing-wage + fringe / H&W rate table parsed from a WD, plus the EO minimum-wage floor

  • bls_timeseries — BLS time series (CPI-U / ECI escalation, PPI, employment) — the pricing/escalation layer

  • bls_oews_wages — benchmark occupational wages & employment (BLS OEWS) by area × occupation

  • bls_qcew — county × NAICS market size / wages / location quotient (competition density)

  • treasury_debt_to_penny — daily total US public debt outstanding (Treasury Fiscal Data)

  • treasury_avg_interest_rates — average interest rate the Treasury pays by security type

  • treasury_monthly_statement — Monthly Treasury Statement: receipts, outlays, deficit/surplus by month

  • treasury_query_dataset — escape-hatch query over 7 confirmed Treasury Fiscal Data datasets

  • bea_regional_data — GDP / personal income by industry × geography (BEA Regional; requires free BEA_API_KEY)

  • census_business_patterns — establishments / employment / annual payroll by NAICS × geography (Census CBP; requires free CENSUS_API_KEY)

  • fred_search_series — search the FRED macroeconomic series catalog (GDP/CPI/rates/unemployment; requires free FRED_API_KEY)

  • fred_series_observations — time-series observations for a FRED series (missing values → null; requires free FRED_API_KEY)

  • gsa_perdiem_rates — federal travel per-diem: monthly lodging + M&IE meals caps by city+state or zip (keyless via DEMO_KEY)

  • nih_reporter_search_projects — awarded NIH RePORTER research-grant projects

  • nsf_search_awards — awarded NSF research-grant awards

  • nsf_get_award — one NSF award by its numeric award id

  • clinicaltrials_search_studies — federally-registered clinical studies with sponsor/funder enrichment

  • clinicaltrials_get_study — one clinical study by NCT id (incl. brief summary)

  • clinicaltrials_facet_counts — exact per-value study-count distribution over the whole registry

  • cms_search_datasets — discover CMS Open Payments (Sunshine Act) datasets

  • cms_query_dataset — query a CMS Open Payments datastore distribution (industry→physician payments)

  • nppes_lookup_provider — CMS/HHS NPPES NPI Registry provider lookup

  • cms_medicare_provider_services — Medicare provider utilization & payments (healthcare market sizing)

  • cms_hospital_compare — CMS Hospital Compare quality ratings

  • cms_facility_directory — CMS nursing-home / home-health / hospice / dialysis facility directories

  • cms_dmepos_suppliers — CMS DMEPOS (durable medical equipment) supplier directory + Medicare spend

  • cms_revoked_providers — CMS Medicare revocation / exclusion list (provider compliance vetting)

  • cve_lookup — look up NIST NVD CVE records

  • cisa_kev_lookup — filter the CISA Known Exploited Vulnerabilities catalog (binding BOD 22-01 remediation due-dates)

  • nist_800_53_controls — NIST SP 800-53 Rev 5 security & privacy controls lookup (FedRAMP/CMMC/RMF requirement text by controlId/family/keyword)

  • hts_lookup — US import-tariff classification + duty rates from the USITC Harmonized Tariff Schedule

  • cbp_border_wait_times — live CBP land-border commercial-vehicle wait times (Canadian + Mexican ports; freight/logistics)

  • census_geocode_address — resolve a one-line US address → matched address + Census geographies (tract, CD, place)

  • census_geographies_by_coordinates — resolve a longitude/latitude point → Census geographies

  • fema_disaster_declarations — FEMA disaster / emergency declarations by state, type, incident, year

  • fema_search_public_assistance — FEMA Public Assistance funded projects

  • fema_search_hazard_mitigation — FEMA Hazard Mitigation Assistance projects (HMGP/FMA/PDM/BRIC mitigation grants to state/local/tribal subrecipients; disaster-resilience, distinct from Public Assistance recovery)

  • nws_active_alerts — currently-active NWS weather alerts (watches/warnings/advisories; disaster/climate readiness, pairs with the FEMA tools)

  • socrata_discover_datasets — find Socrata dataset 4x4 ids by keyword

  • socrata_query — query rows from an allowlisted Socrata/SODA open-data portal (53 curated state/county/city + federal hosts — checkbook, contracts, vendor payments, live solicitations across the SLED tier)

  • ckan_discover_datasets — find CKAN datastore resource ids by keyword

  • ckan_query — query rows from an allowlisted CKAN datastore resource (state/city spend/checkbook)

  • opengov_list_governments — directory of 525+ US state/local governments on OpenGov Procurement (filter by state/query)

  • opengov_search_solicitations — a government's live public solicitations (title, status [open = accepting], deadline, portal link) — keyless anonymous endpoints

  • bonfire_list_organizations — curated live-verified 186-org US seed directory of governments on Bonfire (Euna)

  • bonfire_search_opportunities — an org's currently-open opportunities via keyless RSS (referenceNumber, name, closeDate, link); the RSS is the complete open set (exact total)

  • arcgis_hub_discover_datasets — discover ArcGIS Hub datasets by keyword (the SLED GIS/infrastructure/permits/procurement layer Socrata & CKAN don't cover; a discovery aid with publisher surfaced for vetting)

  • arcgis_feature_query — query rows from a curated allowlist of 23 US-gov ArcGIS REST feature layers: DC OCP PASS live solicitations; local-gov checkbooks/contracts; state DOT bid/award registers (TX / AK / IA / OK)

  • datagov_search_datasets — search the data.gov v4 catalog for federal open datasets across all publishing agencies

  • search_gov_domains — CISA get.gov authoritative .gov domain registry (resolve which org owns a .gov domain; enumerate federal agencies + map SLED entities)

  • sba_size_standard — SBA small-business size standard for a 6-digit NAICS (set-aside eligibility gate)

  • dol_list_datasets — browse DOL enforcement/compliance datasets (WHD, OFCCP, …) — keyless catalog

  • dol_get_dataset — fetch DOL enforcement records (WHD wage-hour / OFCCP; requires free DOL_API_KEY)

  • lda_search_filings — Senate lobbying filings: who lobbies which agency, on what issue, for how much (keyless)

  • api_key_status — list which API keys the server can use, required vs optional, signup URLs, and whether each is currently set (value never shown)


Reliability & offline snapshots

This server is built around one rule: honest failure over confident fabrication. Everything below is about availability of public data — none of it bypasses access controls.

Keyless-first, and a down source throws. Every source works with no API key. When a source is rate-limited, blocked, or down, the tool returns a typed error (rate_limited / upstream_unavailable / schema_drift / …) — it never invents rows and never reports a DOWN service as "0 results" or "not found". A genuine empty result and an outage are always distinguishable.

Offline snapshots (on by default). Some reference data changes slowly — the toptier-agency list, the top-level NAICS tree, the USAspending glossary, SBA size standards, the latest Treasury "Debt to the Penny." By default, when a live federal source is briefly unreachable from your egress, the server falls back to a public, weekly-refreshed snapshot of that slow-changing reference data, hosted at raw.githubusercontent.com/cliwant/mcp-sam-gov/snapshots. It only fetches on a live hard-failure (an outage / IP-reputation block), never during normal operation — public data, no telemetry. A served snapshot is never presented as live — the response carries _meta.dataPath: "snapshot" plus an asOf timestamp, and complete is forced off, so an AI agent (and you) always see the staleness. A rate limit (429) is always honored, never routed around onto the mirror.

  • Disable it (pure live-only): set SAMGOV_SNAPSHOT_BASE_URL=off. Then no snapshot path is ever added and behavior is byte-for-byte identical to a live-only client.

  • Point at your own mirror: set SAMGOV_SNAPSHOT_BASE_URL to your base URL to host the snapshots yourself instead of using the public default.

    { "mcpServers": { "sam-gov": { "command": "mcp-sam-gov",
        "env": { "SAMGOV_SNAPSHOT_BASE_URL": "off" } } } }
  • Build the snapshots: run node scripts/build-snapshots.mjs from any clean, non-blocked egress (a laptop / home / clean CI runner). It self-diagnoses per-source reachability, prints a reachability table, and writes a manifest.json. On partial coverage it refreshes only the sources it can reach and leaves the last-good file in place for the rest (stale-but-honest, never blanked). It exits non-zero only when zero sources were reachable (a fully blocked egress — the signal to re-run from a cleaner one).

  • The honest boundary. This covers public-data availability only. The snapshot builder ingests only public, redistributable (public-domain / CC0) data, and the reader refuses to serve any envelope not marked accessLevel: "public". It honors rate limits (a 429 is never routed around), uses no proxies, no IP rotation, no auth/paywall/CAPTCHA bypass, and refuses off-host redirects. If a source is blocked, the honest remedy is to build from a cleaner egress — not to evade the block.


Troubleshooting

Symptom

Fix

Claude Desktop 🔨 menu doesn't show sam-gov

Fully quit Claude Desktop (system tray on Windows / Quit menu on macOS) and reopen. Check %APPDATA%\Claude\logs\mcp*.log

command not found: mcp-sam-gov

Confirm npm install -g . succeeded; check that npm's global bin is on PATH (npm config get prefix)

MODULE_NOT_FOUND ...dist/server.js after npm install -g github:...

npm bug with git-dep symlinks on Windows. Use the clone + npm install -g . recipe (Path 3) instead.

EPERM: operation not permitted, rmdir during install

Previous failed install left dangling files. Run rmdir /s /q "%APPDATA%\npm\node_modules\@cliwant" (or @govicon if you installed an early version) then retry.

npm install fails with "private repo" / 404

The repo is now public — should not happen. If it does, try git clone https://github.com/cliwant/mcp-sam-gov.git directly.

Tools return empty results

SAM.gov rate-limits aggressive callers. Wait 1 minute. Or set SAM_GOV_API_KEY for the higher-rate authenticated path.

"Tool error: USAspending POST returned 400"

Usually means a field has a wrong type (e.g. fiscal year as string). Check the tool input schema in your host's tool browser.


Use as a TypeScript / JavaScript library (no MCP)

Beyond the MCP server, this package also exports the underlying federal-data clients as importable modules. Useful if you're building your own SaaS, AI agent, or CLI and want programmatic access without spawning an MCP server.

npm install @cliwant/mcp-sam-gov
// SAM.gov client
import { SamGovClient } from "@cliwant/mcp-sam-gov/sam-gov";

const sam = new SamGovClient(); // keyless
const result = await sam.searchOpportunities({ ncode: "541512", limit: 5 });
const opp = await sam.getOpportunity("5ef3db5daeb54099a96d487783a38bd0");
// USAspending wrappers
import * as usas from "@cliwant/mcp-sam-gov/usaspending";

const recompete = await usas.searchExpiringContracts({
  agency: "Department of Veterans Affairs",
  naics: "541512",
  monthsUntilExpiry: 12,
});
const recipient = await usas.getRecipientProfile("ed02855e-60d7-2540-...-P");
// Federal Register / eCFR / Grants.gov
import * as fedreg from "@cliwant/mcp-sam-gov/federal-register";
import * as ecfr from "@cliwant/mcp-sam-gov/ecfr";
import * as grants from "@cliwant/mcp-sam-gov/grants";

const farResults = await ecfr.search({ query: "SDVOSB", titleNumber: 48 });

This is the canonical home for the Cliwant federal-data libraries — there is no separate library package. Two earlier repos (govicon-sam-gov and govicon-mcp-sam-gov) have been archived and consolidated here. All client code lives in src/sam-gov/, src/usaspending.ts, src/federal-register.ts, src/ecfr.ts, src/grants.ts.

Privacy Policy

This server runs locally and collects nothing — no telemetry, no analytics, no accounts. Your prompts and results are processed in memory on your machine and are never sent to Cliwant. Each tool calls the relevant official government API directly over HTTPS; optional API keys stay in your local environment and are sent only to that source. See the full Privacy Policy (contact: seungdo.keum@cliwant.com).

License

MIT — see LICENSE.

Disclaimer

This server uses publicly available federal API endpoints. It is not affiliated with the General Services Administration, SAM.gov, USAspending.gov, the Office of the Federal Register, the National Archives, Grants.gov, or any federal agency. Federal procurement, spending, and regulation data is in the public domain.

Available Tools

152 tools
api_key_statusA
Read-only

List every API key this server can use, whether each is REQUIRED or OPTIONAL, the free signup URL + what it unlocks, and whether it is CURRENTLY configured — a boolean only; the key VALUE is NEVER shown. KEYLESS (no input). Most sources are keyless; four sources need a key — Census (census_business_patterns), FRED (2 tools), and BEA (bea_regional_data) require one outright, and DOL's DATA endpoint (dol_get_dataset) needs one too (its catalog, dol_list_datasets, stays keyless) — the other 6 keys are OPTIONAL (raise a rate limit or unlock one filter). Keys can be set as host env vars OR in a .env file in the server's working directory (auto-loaded at startup; real env wins over .env). Returns { keys:[{ envVar, sources[], required, signupUrl, unlocks, note, currentlySet }], requiredMissing:[envVars], optionalMissing:[envVars], allKeysFree:true }. This tool tells you the CONFIG state; to verify a key actually WORKS, call that source's own tool. Getting a key (creating the account at the signup URL) is your step — the server automates discovery + configuration, not signup.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint), the description discloses that key values are never shown, only boolean 'currentlySet'. It explains the return JSON structure, how keys are loaded (env vars/.env), and that this tool reports config state, not key validity. No contradictions with annotations.

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 detailed but every sentence adds value. It could be slightly more concise, but the length is justified given the complexity of the tool. It front-loads the purpose and then provides necessary specifics.

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?

The description is exceptionally complete: it specifies the return structure, behavior around key values, key sources, setup mechanisms, and distinguishes between config and functional verification. It compensates fully for the lack of output schema.

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

Parameters5/5

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

With 0 parameters and 100% schema coverage, the description reinforces that the tool is 'KEYLESS (no input)', adding clarity beyond the empty schema. It eliminates any doubt about required inputs.

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: 'List every API key this server can use' with specific details about required vs optional, signup URLs, and configuration status. It distinguishes itself from data-fetching sibling tools by focusing on configuration state.

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 explicitly says when to use this tool (check configuration state) and when not (to verify a key works, call the source's own tool). It provides guidance on key setup (env vars or .env file). A clear 'when-not' is given, but no explicit listing of alternative tools for verification.

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

arcgis_feature_queryA
Read-only

Query rows from a curated US-government ArcGIS REST feature layer (keyless) — the QUERY companion to arcgis_hub_discover_datasets (which discovers Hub datasets). A large amount of SLED procurement/GIS data lives on ArcGIS. First payload: the DC Office of Contracting & Procurement 'PASS' layers — dc_pass_solicitations (DC's LIVE open solicitations, ~25k: SOLICITATIONNUMBER, SOLICITATIONTITLE, DUE_DATE, OPENDATE, CLOSEDATE, NIGPCODE, CONTRACTINGOFFICER, AWARD_TO, 46 fields), dc_pass_contracts (~50k), dc_pass_purchase_orders (~275k), dc_pass_payments (~1.55M). Inputs: service (the allowlist ENUM — the SSRF core, never a free host), where (ArcGIS SQL-ish filter, default '1=1', e.g. "SOLICITATIONTITLE LIKE '%security%'"), outFields (default '*'), orderByFields, limit(1..1000)/offset. Returns { service, records:[{…attributes verbatim…}] } + honest _meta. HONESTY: totalAvailable = the layer's EXACT match count (a returnCountOnly companion query, never the page length; a count failure ⇒ null + note, rows still returned); ★ArcGIS date fields are epoch MILLISECONDS and a negative/sentinel (≈1900) is a placeholder — surfaced verbatim, never coerced; a genuine no-match ⇒ complete:true/returned:0; a 429/5xx/timeout THROWS; an ArcGIS {error} body (e.g. a bad where) ⇒ invalid_input/upstream (surfaced, never a fake empty); a non-array features ⇒ schema_drift. SSRF: fixed allowlist base + hostname assertion + redirect:error (where/outFields cannot alter the host).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page (→ resultRecordCount), 1..1000, default 50.
whereNoArcGIS SQL-ish filter (default '1=1'), e.g. "SOLICITATIONTITLE LIKE '%security%'" or "DUE_DATE > 1750000000000". Filters the read-only layer; a malformed clause ⇒ invalid_input (surfaced).
offsetNo0-based offset (→ resultOffset). Page with _meta.pagination.nextOffset; totalAvailable = the layer's exact match count.
serviceYesThe curated ArcGIS layer (SSRF allowlist enum). DC OCP PASS: 'dc_pass_solicitations' (live solicitations ~25k), 'dc_pass_contracts', 'dc_pass_purchase_orders', 'dc_pass_payments'. Other US local govs: 'asheville_purchase_orders'/'asheville_po_summary' (Asheville NC), 'bellevue_vendor_payments'/'bellevue_awarded_contracts' (Bellevue WA), 'miamidade_purchase_orders_2025'/'miamidade_purchase_orders_2017' (Miami-Dade FL, current/2017), 'suffolk_county_ny_contracts_2018' (Suffolk County NY), 'matsu_borough_ak_checkbook' (Matanuska-Susitna Borough AK), 'lasvegas_checkbook' (Las Vegas NV ~373k), 'baltimore_checkbook' (Baltimore City MD ~367k), 'naperville_vendor_payments' (Naperville IL ~127k), 'worcester_ma_checkbook_fy25' (Worcester MA FY25), 'lasvegas_purchasing_contracts' (Las Vegas NV contract register), 'txdot_construction_projects' (Texas DOT, awarded construction company ~85k), 'akdot_construction_awards'/'akdot_aashtoware_proposals' (Alaska DOT&PF bid awards/proposals), 'iowadot_public_bid_awards' (Iowa DOT public bid), 'okdot_cirb_contract_status' (Oklahoma DOT CIRB contract status), 'topeka_checkbook_aggregate' (Topeka KS checkbook FY2015–2023 ~332k). 23 curated services (state DOT bid/award registers: TX/AK/IA/OK + municipal checkbooks/contracts).
outFieldsNoComma-separated fields to return (default '*' = all). e.g. 'SOLICITATIONNUMBER,SOLICITATIONTITLE,DUE_DATE,NIGPCODE'.
orderByFieldsNoArcGIS orderByFields, e.g. 'DUE_DATE DESC'. Optional.

TDQS

A4.7/5.0
Behavior5/5

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

Goes far beyond the readOnlyHint and openWorldHint annotations by detailing honesty measures (count behavior, date epoch handling, no-match responses, error surfacing, schema drift detection, SSRF protection). Comprehensive behavioral disclosure.

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?

Well-structured with sections and front-loaded with purpose. Somewhat verbose but every sentence adds value; could be slightly tightened without losing information.

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?

Given 6 parameters, 23 services, pagination, and no output schema, the description is remarkably complete: covers return structure, pagination mechanics, date field caveats, error cases, and SSRF protections. No gaps.

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

Parameters5/5

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

Adds substantial meaning beyond the 100% schema coverage: explains service enum values in detail, provides example where clauses, clarifies pagination with limit/offset and _meta field, and describes output format.

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

Purpose5/5

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

Clearly states 'Query rows from a curated US-government ArcGIS REST feature layer' and distinguishes itself as the QUERY companion to arcgis_hub_discover_datasets. Provides specific layer examples and context.

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

Usage Guidelines4/5

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

Explicitly names the sibling tool arcgis_hub_discover_datasets and frames this tool as its query counterpart. Describes the data domain (SLED procurement/GIS) but does not provide explicit when-not-to-use scenarios or other alternatives.

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

arcgis_hub_discover_datasetsA
Read-only

Discover ArcGIS Hub datasets by keyword — the SLED/GIS open-data layer that Socrata and CKAN do NOT cover (keyless; hub.arcgis.com/api/v3/datasets). Much US state/local/regional/tribal open data (GIS, infrastructure, permits, zoning, boundaries, procurement) is published on ArcGIS Hub. Input query (→q, REQUIRED, ≥2 non-whitespace chars — a broad whole-Hub scan is refused), openDataOnly (default TRUE → filter[openData]=true, the B2G-relevant designated-open-data subset; false broadens to all shared items), limit (1..100, def 20 → page[size]), offset (0-based → page[start]=offset+1). Returns { query, openDataOnly, datasets:[{ id, name, description, owner, orgName, source, region, type, sector, keywords, downloadable, hasApi, created, modified, landingPage, itemId }] } + honest _meta. ★PROVENANCE (the crux — a DIFFERENT trust posture from our other sources): ArcGIS Hub is a GLOBAL, OPEN publishing platform — results include NON-US and NON-GOVERNMENTAL publishers. This is a DISCOVERY aid, NOT a curated official-source allowlist (unlike socrata_query): the per-row owner/orgName/source/region are surfaced VERBATIM so you can VET the publisher before relying on the data, and the global-platform caveat rides EVERY response. DISCOVERY ONLY — metadata + links; to read rows follow the dataset on its own ArcGIS endpoint (a guarded row-query tool is a planned addition). HONESTY: totalAvailable = the EXACT Hub match count (meta.total, NEVER data.length — P1); pagination is a 0-based offset (nextOffset when more remain); every scalar null-never-empty, booleans null-preserving, counts null-never-0; a genuine no-match ⇒ complete:true/returned:0; a 429 ⇒ rate_limited / 5xx/timeout ⇒ upstream_unavailable THROWS (never a fake empty); a 200 non-JSON / non-array data ⇒ schema_drift.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDatasets per page (→ page[size]), 1..100, default 20.
queryYesKeyword search over ArcGIS Hub datasets (→ q), e.g. 'procurement contract', 'zoning permits'. REQUIRED, ≥2 non-whitespace chars (a broad scan of the whole global Hub is refused).
offsetNo0-based record offset (→ page[start]=offset+1). Page with _meta.pagination.nextOffset; totalAvailable is the exact Hub match count.
openDataOnlyNoWhen true (default), filter to items the publisher designated as open data (→ filter[openData]=true) — the B2G-relevant subset. Set false to broaden to ALL shared items (vet the publisher even more).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations provide readOnlyHint and openWorldHint. The description adds extensive behavioral details: provenance (global, non-governmental), honesty about pagination, null handling, error conditions (429, 5xx, non-JSON). No contradictions with annotations.

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 detailed and well-structured with sections (provenance, honesty), but it is verbose. However, given the complexity of the tool and the need for trust posture clarification, the depth is justified. Could be slightly trimmed without losing value.

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?

Despite lacking an output schema, the description fully documents the return structure (datasets fields, _meta) and covers error handling, pagination, and trust posture. This provides complete guidance for agent invocation and interpretation.

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

Parameters5/5

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

Schema coverage is 100%. The description adds significant value beyond the schema by explaining the query constraint (≥2 chars), default behavior for openDataOnly, limit range, offset mapping to page[start], and the meaning of each parameter in API terms (→ q, filter[openData]).

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: 'Discover ArcGIS Hub datasets by keyword' and distinguishes it from sibling tools like Socrata and CKAN by specifying the coverage gap. It provides a specific verb and resource, making it easy for an agent to understand what it does.

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

Usage Guidelines5/5

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

The description explicitly defines when to use this tool (for ArcGIS Hub data not covered by others) and when not (global platform, not curated; mentions a planned row-query tool). It contrasts with socrata_query and gives clear prerequisites (query required, min length).

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

bea_regional_dataA
Read-only

Regional (county / state / MSA) economic data — GDP by industry and personal income — from the US Bureau of Economic Analysis (BEA) Regional Economic Accounts (apps.bea.gov/api/data, dataset 'Regional'). ★REQUIRES a free BEA_API_KEY: the BEA Data API has NO keyless tier, so without the key this tool THROWS an honest config error (get one at https://apps.bea.gov/API/signup/; call api_key_status to see every source's key requirement). Input: tableName (required, e.g. 'CAGDP2' county GDP by industry, 'SAGDP2N' state GDP, 'CAINC1'/'SAINC1' personal income), geoFips (required — 'STATE' for all states, a county FIPS like '06075', or an MSA code), lineCode (required — an integer industry line like '1', or 'ALL'), optional year ('LAST5' default, a 4-digit year, or 'ALL'), frequency ('A' annual default, or 'Q'). Returns { rows:[{ geoFips, geoName, timePeriod, lineCode, dataValue, unitOfMeasure, unitMult, noteRef }], notes:[{ noteRef, noteText }] } + honest _meta. ★HONESTY (the crux): a missing/invalid key — or ANY bad parameter — returns HTTP 200 carrying an Error object (NOT an HTTP error status); this is detected and surfaced as invalid_input carrying BEA's APIErrorDescription — NEVER a fake empty. dataValue is parsed from BEA's comma-formatted string ('1,234,567'→1234567); BEA suppression/not-available codes ((NA)/(D)/(NM)/(L)/*) map to null — NEVER 0 (a genuine 0 stays 0). unitMult (a power-of-10 multiplier) and unitOfMeasure are reported ALONGSIDE the raw dataValue — the value is NOT multiplied in (apply unitMult yourself). BEA returns the COMPLETE set for the filter (no pagination) ⇒ totalAvailable = the row count, complete:true; a genuine empty Data:[] ⇒ honest empty (returned:0); a 5xx ⇒ THROWS; a 200 non-JSON ⇒ schema_drift. The key rides ONLY in the UserID= query param — never logged or echoed.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoThe data year: a 4-digit year (e.g. '2022'), 'LAST5' (the latest 5 years, default), or 'ALL'. Validated ^(\d{4}|LAST5|ALL)$.
geoFipsYesThe BEA GeoFips selector: 'STATE' (all states), a county FIPS like '06075', or an MSA code. Validated ^[A-Za-z0-9]{2,10}$. Required.
lineCodeYesThe industry/statistic line code — an integer (1–4 digits), e.g. '1', or 'ALL' for every line in the table. Validated ^([0-9]{1,4}|ALL)$. Required.
frequencyNoData frequency: 'A' (annual, default) or 'Q' (quarterly).
tableNameYesA BEA Regional table code (2–20 alphanumerics), e.g. 'CAGDP2' (county GDP by industry), 'SAGDP2N' (state GDP by industry), 'CAINC1'/'SAINC1' (personal income). Validated ^[A-Za-z0-9]{2,20}$. Required.

TDQS

A4.7/5.0
Behavior5/5

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

The description is exceptionally transparent: it discloses that missing/invalid keys produce HTTP 200 with Error object (not HTTP error), explains data parsing of comma-formatted strings, maps suppression codes to null, and clarifies that unitMult is not applied. All this goes well beyond the readOnlyHint and openWorldHint annotations.

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 dense and informative, but slightly long. It is front-loaded with purpose and key requirement. A more structured format (e.g., bullet points for parameters) could improve readability, but the current prose is efficient and every sentence adds value.

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?

Despite lacking an output schema, the description fully specifies the return format ({ rows:[...], notes:[...] }) and edge cases (empty result, 5xx, non-JSON response). It covers authentication, error handling, and data interpretation, making it complete for a complex API tool.

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

Parameters5/5

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

Schema coverage is 100%, and the description adds significant meaning: examples of tableName ('CAGDP2', 'SAGDP2N'), geoFips ('STATE', '06075'), lineCode (integer or 'ALL'), year ('LAST5', '2022'), frequency ('A', 'Q'). It also explains the response fields, which is not present in the schema.

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

Purpose5/5

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

The description clearly states the tool returns regional economic data (GDP, personal income) from the BEA. It distinguishes itself from sibling tools by specifying the exact data source and API. Even without explicit comparison, the purpose is unambiguous and complete.

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

Usage Guidelines4/5

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

The description provides explicit usage context: requires BEA_API_KEY, explains key requirement, parameter details, and error handling. It does not explicitly state when not to use the tool, but the specificity of the domain (BEA regional data) makes misuse unlikely.

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

bls_oews_wagesA
Read-only

Benchmark US occupational wages & employment from BLS OEWS (Occupational Employment & Wage Statistics) — the LEVEL layer for labor-rate benchmarking (keyless; api.bls.gov Public Data API, POST/JSON batch). The actual mean/median annual & hourly wage a labor category commands, by area — next to gsa_benchmark_labor_rates (GSA CALC), sam wage determinations, and bls_timeseries (the CPI/ECI escalation layer). OEWS series IDs are 25 chars (area×occupation×industry×datatype), EXCEEDING bls_timeseries's raw-seriesId cap, so this tool BUILDS the ID INTERNALLY from validated structured inputs. Inputs (at least one of occupation/soc REQUIRED; all arrays batch into ONE POST — the cartesian product area×occupation×datatype is capped at the active tier's series cap and refused over-cap WITH THE COUNT NAMED, never silently truncated): occupation — a CURATED 16-key SOC enum (typo-proof; e.g. software_developer=15-1252, civil_engineer=17-2051, management_analyst=13-1111); soc — raw 6-digit HYPHENLESS SOC codes for the ~830-SOC long tail (use 151252, not 15-1252); area — default ["national"]; each is "national", a 2-letter USPS state code (CA/TX/DC…), or a 5-digit CBSA metro code (19100 = Dallas-Fort Worth); datatype — default ["annual_mean"]: annual_mean/annual_median (dollars/year), hourly_mean/hourly_median (dollars/hour), employment (count jobs). NO year input — OEWS is ANNUAL and the API serves only the latest release; the tool requests a recent window internally and DISCLOSES the reference year. Returns { results:[{ area:{type,code,label}, occupation:{soc,key,label}, measure:{key,code,units}, value:number|null, valueUnavailable, referenceYear, referencePeriod, footnotes, seriesId }] } + honest _meta. HONESTY: (H1) OEWS is an ANNUAL point-in-time snapshot (reference May , period A01), NOT monthly/current-quarter — disclosed every call; (H2) a built ID that returns empty/absent ⇒ value:null, valueUnavailable:FALSE (the occupation is not surveyed/estimated there OR the cell is suppressed for confidentiality) + the not-published note + the surfaced upstream "Series does not exist" message + the ID in fieldsUnavailable — NEVER a fabricated 0; a PRESENT "-" in-band value ⇒ null + valueUnavailable:true + footnote; (H3) each row's measure.units labels the datatype (never read an employment count as a wage); (H4) the API returns real numerics (no top-code); a non-SUCCESS status THROWS (REQUEST_NOT_PROCESSED ⇒ rate_limited with the tier disclosure; a non-JSON 200 ⇒ schema_drift). Every response discloses the active tier. An OPTIONAL free BLS_API_KEY lifts to v2 and is sent ONLY in the request body — never a URL/header/log.

ParametersJSON Schema
NameRequiredDescriptionDefault
socNoOne or more RAW 6-digit SOC codes (the long-tail passthrough) — HYPHENLESS (use 151252, not 15-1252; the hyphen is rejected). A raw soc that matches a curated occupation is auto-labeled; otherwise key/label are null. At least one of occupation/soc is required.
areaNoOne or more geographies (default ["national"]). Each element is "national", a 2-letter USPS state code (e.g. CA, TX, DC — the curated state enum), OR a 5-digit CBSA metropolitan code (^\d{5}$, e.g. 19100 for Dallas-Fort Worth). Resolved internally to the OEWS areatype + zero-padded area code; an unknown token is rejected (invalid_input, never a malformed series ID on the wire).
datatypeNoOne or more measures (default ["annual_mean"]): annual_mean (dollars/year), annual_median (dollars/year), hourly_mean (dollars/hour), hourly_median (dollars/hour), employment (count jobs). Each row carries measure.units from this map (H3 — never mislabel).
occupationNoOne or more CURATED occupation enum keys (typo-proof; each carries an SOC + official label): all_occupations, software_developer (15-1252), computer_systems_analyst, info_security_analyst, management_analyst, project_mgmt_specialist, logistician, accountant_auditor, general_ops_manager, civil_engineer, electrical_engineer, mechanical_engineer, industrial_engineer, lawyer, technical_writer, admin_assistant. The ~830-SOC long tail is reachable via `soc`. At least one of occupation/soc is required.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations indicate readOnlyHint and openWorldHint, but the description goes far beyond with a HONESTY section (H1-H4) detailing yearly snapshots, null handling for missing/suppressed data, no fabricated zeros, proper unit labeling, and error handling. This fully discloses the tool's behavioral traits.

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 well-structured with clear sections (purpose, input details, HONESTY), but is quite lengthy. Some redundancy exists (e.g., area validation mentioned in both description and schema). However, every sentence adds value and the key info is front-loaded.

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?

Given the tool's complexity (4 params, no output schema), the description covers all necessary context: input validation, batch behavior, caps, error handling, output format, and relationship to siblings. It leaves no significant gaps for an AI agent.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds critical semantics: the curated occupation enum with SOC mappings, SOC hyphen constraint, area formats (national/state/metro), datatype meanings, batch processing, and caps. This greatly enriches the schema.

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

Purpose5/5

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

The description clearly states the tool benchmarks US occupational wages and employment from BLS OEWS, distinguishing it from sibling tools like gsa_benchmark_labor_rates and bls_timeseries. It specifies the data source, methodology, and purpose.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use the tool (labor-rate benchmarking), names alternatives (gsa_benchmark_labor_rates, etc.), explains input requirements (at least one of occupation/soc), batch behavior, and caps. It also warns against common mistakes like using hyphens in SOC codes.

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

bls_qcewA
Read-only

BLS QCEW (Quarterly Census of Employment & Wages) — county×NAICS MARKET-SIZE / wages / location-quotient (keyless; data.bls.gov/cew Open Data Access CSV, a SECOND un-rate-limited BLS domain — NOT the ~25/day api.bls.gov timeseries API). Answers the market-size / competition-density question no other tool can: for ONE area_fips (county/state/metro/US) OR ONE NAICS × quarter — establishment COUNT (market size / competitor density), county×NAICS employment, average weekly wage (labor cost), and the LOCATION QUOTIENT (lq_* = concentration vs the national average; >1.00 = more concentrated / higher competition density). Inputs: mode (REQUIRED {area,industry}); area (area_fips ^[0-9A-Za-z]{1,6}$ — REQUIRED path segment for mode=area, else an optional client-side narrow); industry (NAICS ^[0-9]{1,6}$ DIGIT-ONLY — REQUIRED path segment for mode=industry, else an optional narrow; a hyphenated 31-33 404s, use the digit aggregate); year (REQUIRED 1990..current), quarter (REQUIRED 1|2|3|4); client-side ownership(own_code)/aggregationLevel(agglvl_code)/sizeCode; limit (≤1000, def 50)/offset. Wire: GET data.bls.gov/cew/data/api/{year}/{quarter}/{mode}/{code}.csv. Returns { found, mode, area|industry, year, quarter, rows:[{ area_fips, own_code, industry_code, agglvl_code, size_code, base:{ disclosed, disclosureCode, qtrly_estabs, month1/2/3_emplvl, total_qtrly_wages, taxable_qtrly_wages, qtrly_contributions, avg_wkly_wage }, locationQuotient:{ disclosed, disclosureCode, lq_qtrly_estabs, lq_… }, overTheYear:{ disclosed, disclosureCode, oty_qtrly_estabs_chg, oty_…_pct_chg } }] } + honest _meta. ★DISCLOSURE-SUPPRESSION HONESTY (the crux): each row carries THREE disclosure codes (base/lq/oty), each governing its block. QCEW encodes a SUPPRESSED (confidential) employment/wage value as a literal 0 — so under 'N' the confidential emplvl/wage/avg-wkly fields map to null (WITHHELD, never a fabricated $0), while the establishment COUNT (qtrly_estabs / lq_qtrly_estabs) AND its over-the-year change (oty_qtrly_estabs_chg / pct_chg) stay DISCLOSED (real); under '-' the WHOLE block incl. the estabs field(s) → null; under blank a genuine reported/NEGATIVE 0 SURVIVES (the disclosed federal taxable=0/contrib=0 and the oty*_chg=0 'no change'). NEVER a blanket 0→null. A null carries disclosed:false + the raw disclosureCode; a suppression note fires whenever any page row is suppressed. HONESTY: totalAvailable is the EXACT filtered row count (fetch-once + client-side limit/offset — QCEW does not paginate; never the page length); a per-tuple HTTP 404 ⇒ honest empty (found:false, the HTML 404 body NEVER parsed as CSV); a 5xx/timeout ⇒ THROW; a 200 non-CSV / a renamed/±column header / a wrong field-count row ⇒ schema_drift THROW (symmetric drift guard). The file MIXES aggregation levels + ownerships — a do-NOT-sum-across-agglvl/ownership note rides every response. PUBLIC AGGREGATE stats (the suppression mechanism keeps small-cell data non-identifying — no PII). Keyless, un-rate-limited; NO BLS_API_KEY is read.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoThe area_fips (^[0-9A-Za-z]{1,6}$): county 01005, statewide 01000, national US000, MSA C1018, CSA CS122. REQUIRED when mode=area (the path segment). When mode=industry it is an OPTIONAL client-side narrow (keep only rows for this area_fips).
modeYesREQUIRED — the slice shape: 'area' (all industries × ownership × aggregation levels for ONE area_fips) or 'industry' (all areas for ONE NAICS). A fixed enum interpolated as a LITERAL path segment.
yearYesREQUIRED — the 4-digit year (1990..2027). QCEW Open Data coverage begins ~1990; a pre-coverage or future year is an honest per-tuple HTTP 404 (found:false), NOT zero establishments.
limitNoRows per page (CLIENT-SIDE window over the fetched-once slice), 1..1000, default 50.
offsetNo0-based row offset for CLIENT-SIDE pagination over the filtered set (QCEW has no server-side pagination), default 0.
quarterYesREQUIRED — the quarter '1'|'2'|'3'|'4' (all four live-servable). The annual 'a' is not enabled this build.
industryNoThe NAICS code (DIGIT-ONLY ^[0-9]{1,6}$): 5415, or the aggregate 10. REQUIRED when mode=industry (the path segment). When mode=area it is an OPTIONAL client-side narrow (keep only rows for this NAICS). A hyphenated NAICS supersector (31-33, 44-45) 404s on QCEW — pass its digit aggregate code, never the hyphenated form.
sizeCodeNoOptional CLIENT-SIDE filter on size_code.
ownershipNoOptional CLIENT-SIDE filter on own_code (e.g. 0=Total, 1=Federal, 2=State, 3=Local, 5=Private). Never on the URL (no SSRF surface).
aggregationLevelNoOptional CLIENT-SIDE filter on agglvl_code (e.g. 70=total-all-industries, 78=6-digit-NAICS-by-ownership). Filter to ONE agglvl_code for a coherent, non-double-counted total.

TDQS

A4.8/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint and openWorldHint annotations, detailing disclosure-suppression behavior (null vs 0), honesty measures (totalAvailable, HTTP 404 handling, schema drift protection), and the mixing of aggregation levels. No contradictions with annotations.

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 long (multiple paragraphs) and includes extensive detail. While well-structured with bullet points and sections, it could be more concise for an AI agent. The length is justified by the API complexity but still reduces conciseness.

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?

Given the tool's complexity (10 parameters, no output schema), the description is highly complete. It explains the output structure, disclosure codes, error handling, and client-side pagination, leaving no critical gaps in understanding.

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

Parameters5/5

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

Schema coverage is 100% and the description adds substantial context: format constraints (regex for area_fips, digit-only NAICS), that mode is a literal path segment, client-side pagination semantics for limit/offset, and the effect of hyphenated NAICS. This clarifies usage beyond the schema.

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

Purpose5/5

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

The description clearly states the tool retrieves BLS QCEW data (market size, employment, wages, location quotient) and distinguishes it from the rate-limited bls_timeseries API. It specifies the resource and the unique value proposition (un-rate-limited, keyless).

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

Usage Guidelines5/5

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

The description explicitly provides when to use this tool (market-size/competition-density questions) and contrasts it with alternatives. It details required parameters (mode, year, quarter) and conditional parameters (area/industry), warns about hyphenated NAICS causing 404s, and explains client-side filters.

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

bls_timeseriesA
Read-only

Fetch US Bureau of Labor Statistics time series — the PRICING / ESCALATION layer (keyless; api.bls.gov Public Data API v1, POST/JSON batch). CPI-U & ECI drive federal contract escalation / economic-price-adjustment (EPA) clauses; PPI benchmarks materials pricing; CES employment/wages give labor-rate context (next to gsa_benchmark_labor_rates + sam wage determinations). Inputs (at least one of series/seriesId REQUIRED; both combinable): series — a FROZEN 9-key CURATED enum (typo-proof; each carries meaning + units): cpi_u_all/cpi_u_core (CPI-U index, NSA — the escalation reference), ppi_final_demand (PPI index), eci_total_comp/eci_wages (★12-MONTH % CHANGE, NOT an index — a consumer misreads 3.4 as an index level otherwise), unemployment_rate/labor_force_participation (percent, SA), employment_total_nonfarm (thousands of persons, SA), avg_hourly_earnings (dollars/hour, SA). seriesId — raw BLS IDs (charclass ^[A-Z0-9]{1,20}$; the OEWS/local-area/regional passthrough; units:null for a raw ID). startYear/endYear (1900..currentYear+1; default a ~10-year window; span CLAMPED to the tier cap ~10y and disclosed). Returns { series:[{ seriesId, key, meaning, units, observations:[{ year, period, periodName, value, valueUnavailable, footnotes, latest }], observationCount, coveredRange }] } + honest _meta. HONESTY: each value is PARSED number|null — the BLS "-" unavailable marker (e.g. the 2025 lapse-in-appropriations gap) → null NEVER 0, with valueUnavailable:true + the footnote reason on the observation AND lifted into _meta.notes (a data gap is DISCLOSED, never a silent null and never a fabricated 0); a genuine "0" stays 0. A non-SUCCESS status THROWS (never a fake-empty): REQUEST_NOT_PROCESSED (the v1 ~25/day limit) ⇒ rate_limited with the tier disclosure; REQUEST_FAILED ⇒ upstream_unavailable/invalid_input surfacing message[]. A non-JSON 200 or a SUCCESS body missing Results.series ⇒ schema_drift. An empty data[] on SUCCESS ⇒ observations:[] + an ambiguity note (a curated key = a genuine empty range; a raw seriesId = EITHER genuine-empty OR a nonexistent/typo'd ID — verify it). Every response discloses the active tier (v1 keyless ~25/day, 25 series/query, ~10y span | v2 with a free BLS_API_KEY ~500/day) + the per-series units caveat. An OPTIONAL free BLS_API_KEY (env; https://data.bls.gov/registrationEngine/) lifts to v2 and is sent ONLY in the request body — never a URL/header/log.

ParametersJSON Schema
NameRequiredDescriptionDefault
seriesNoOne or more CURATED series enum keys (typo-proof; each carries a meaning + units label): cpi_u_all (CPI-U all items NSA, index), cpi_u_core (CPI-U core NSA, index), ppi_final_demand (PPI final demand NSA, index), eci_total_comp (ECI total comp — ★12-MO % CHANGE, not an index), eci_wages (ECI wages — ★12-MO % CHANGE), unemployment_rate (SA, percent), labor_force_participation (SA, percent), employment_total_nonfarm (SA, thousands of persons), avg_hourly_earnings (SA, dollars/hour). NSA CPI-U is the escalation/EPA-clause reference. At least one of series/seriesId is required; both may be combined.
endYearNoInclusive end year (1900..2027). Default: the current year. Must be ≥ startYear.
seriesIdNoOne or more RAW BLS series IDs (power-user passthrough for the un-curatable space — OEWS area×occupation, local-area unemployment LAUCN…, SA/regional CPI variants). Charclass ^[A-Z0-9]{1,20}$ (uppercase alnum; punctuation/whitespace/lowercase rejected — SSRF + 'verify the ID' honesty). A raw ID has units:null (consult BLS). A nonexistent/typo'd ID returns BLS success + empty data (the ambiguity is disclosed, not asserted as 'no data'). At least one of series/seriesId is required.
startYearNoInclusive start year (1900..2027). Default: endYear − 9 (a ~10-year window). The span is CLAMPED to the active tier's cap (v1 ~10 years/query) BEFORE the request and disclosed in _meta.notes (never a silently truncated range).

TDQS

A4.9/5.0
Behavior5/5

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

The description extensively discloses behavioral traits beyond the readOnlyHint and openWorldHint annotations: it details the API method (POST/JSON batch), keyless vs. keyed access, rate limits (v1 ~25/day, v2 ~500/day), data gap handling (null for unavailable, never 0), error throwing for non-success statuses, and tier disclosure. No contradictions with annotations.

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 thorough and well-structured, with purpose front-loaded. While slightly verbose, every sentence serves a purpose (explaining usage, nuances, error handling). Minor redundancy could be trimmed, but overall high value.

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?

Given no output schema, the description fully explains the return format (series array with fields, observations with valueUnavailable, footnotes, etc.), covers edge cases (empty data, ambiguous raw IDs, error scenarios), and discloses tier information. It is complete for the tool's complexity.

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

Parameters5/5

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

With 100% schema description coverage, the description adds significant meaning: it explains each enum value's meaning and units, warns that eci_total_comp/eci_wages are 12-month percent changes (not indices), clarifies raw seriesId charclass and behavior, and details startYear/endYear defaults and clamping.

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 fetches BLS time series for pricing/escalation, with specific examples like CPI-U, PPI, ECI. It distinguishes from sibling tools such as gsa_benchmark_labor_rates and sam wage determinations, providing clear context for use.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: for federal contract escalation, EPA clauses, materials pricing, labor-rate context. It names alternatives (gsa_benchmark_labor_rates, sam wage determinations) and specifies input requirements (at least one of series/seriesId required, both combinable).

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

bonfire_list_organizationsA
Read-only

List US governments on the Bonfire (Euna) eProcurement platform — the directory for bonfire_search_opportunities (keyless). Bonfire hosts thousands of US state/local governments' open-bid portals, each with a keyless RSS feed. Filter the curated seed by state (2-letter) / query (case-insensitive name substring); limit(1..200)/offset. Output: { organizations:[{ org, name, state }] }. Feed a result's org to bonfire_search_opportunities. ★HONESTY: this is a CURATED, live-verified SEED of 187 US orgs — Bonfire has NO keyless org-list API (its authoritative directory is auth-gated, out of bounds), and Euna markets up to ~900 US orgs, so the seed is PARTIAL (disclosed in _meta); probe {slug}.bonfirehub.com/opportunities/rss to extend. totalAvailable = the exact filtered seed count.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoOrgs per page, 1..200, default 50.
queryNoCase-insensitive name substring filter (client-side), e.g. 'county', 'ISD'. Optional.
stateNo2-letter US state filter (client-side), e.g. 'TX', 'CA'. Optional.
offsetNo0-based offset; page with _meta.pagination.nextOffset.

TDQS

A4.8/5.0
Behavior5/5

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

The description goes beyond annotations (readOnlyHint, openWorldHint) by disclosing that the data is a curated, partial seed of 187 orgs, that the authoritative directory is auth-gated, and that the seed may be incomplete. It also describes the output format and pagination mechanism, providing full transparency about limitations and behavior.

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 moderately concise, front-loading the purpose and then providing necessary detail. It could be slightly shorter, but every sentence serves a purpose (context, filtering, output, honesty note). Structure is logical with use cases and limitations clearly separated.

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?

Given there is no output schema, the description thoroughly defines the output format including the fields and pagination metadata. It also addresses the tool's limitations and provides instructions for extending the seed. The 4 parameters are fully explained in context. The description is complete for effective agent use.

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

Parameters4/5

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

While the schema already describes each parameter (100% coverage), the description adds usage semantics: it clarifies that filters are applied client-side on the curated seed, specifies the range for limit, and mentions offset's relationship with pagination metadata. This adds practical meaning beyond the structural schema.

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

Purpose5/5

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

The description explicitly states the tool lists US governments on the Bonfire platform and identifies itself as the directory for bonfire_search_opportunities. It uses a specific verb ('List'), a clear resource ('US governments on Bonfire'), and distinguishes from the sibling tool bonfire_search_opportunities by explaining the relationship.

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

Usage Guidelines5/5

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

The description provides clear usage context: 'Feed a result's `org` to bonfire_search_opportunities' indicates when to use this tool first. It also explains that Bonfire has no keyless API, so this curated seed is the recommended starting point, and suggests an alternative method to extend the seed. This covers when to use and when not to rely solely on the tool.

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

bonfire_search_opportunitiesA
Read-only

List a government's currently-OPEN solicitations on Bonfire (keyless; {org}.bonfirehub.com/opportunities/rss, RSS 2.0). Input org (the subdomain slug from bonfire_list_organizations, e.g. 'harriscountytx', 'broward', 'u-46'; REQUIRED), limit(1..200)/offset. Returns { org, opportunities:[{ referenceNumber, name, description, closeDate, link, pubDate }] } + honest _meta. HONESTY: the RSS is the COMPLETE set of the org's currently-open opportunities (no server pagination), so totalAvailable = the exact open-opportunity count (never a page length) and this tool pages over it client-side; an empty feed (returned 0) means no open opportunities right now (honest empty, complete:true); closeDate is parsed best-effort from the description; a 429/5xx/404/timeout THROWS (never a fake empty); a 200 non-RSS body ⇒ schema_drift; a bad org ⇒ invalid_input pre-fetch. Fixed-suffix SSRF (.bonfirehub.com) + redirect:error. Keyless (Bonfire's auth-gated directory API is NOT used).

ParametersJSON Schema
NameRequiredDescriptionDefault
orgYesThe Bonfire org subdomain slug (from bonfire_list_organizations `org`), e.g. 'harriscountytx', 'broward', 'u-46'. REQUIRED. Lowercase alnum/hyphen; a bad slug ⇒ invalid_input pre-fetch.
limitNoOpportunities per page, 1..200, default 50. The RSS is the complete open set; this pages over it.
offsetNo0-based offset; page with _meta.pagination.nextOffset. totalAvailable = the exact open-opportunity count.

TDQS

A4.7/5.0
Behavior5/5

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

Goes far beyond the readOnlyHint and openWorldHint annotations. Discloses that the RSS is the complete set, client-side pagination, exact totalAvailable, honest empty result, error handling (429/5xx/404 throw, no fake empty), schema drift detection, invalid input pre-fetch, fixed-suffix SSRF, and keyless access. Fully transparent.

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

Conciseness4/5

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

The description is long but well-structured with clear sections (HONESTY, etc.) and no wasted sentences. It front-loads the main purpose. A touch verbose but justified by the complexity.

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?

Despite lacking an output schema, the description explicitly declares the return shape ({ org, opportunities, _meta }) and covers edge cases (empty feed, errors, schema drift). This is complete for an agent to understand and use the tool correctly.

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

Parameters5/5

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

All three parameters have schema descriptions, but the description adds critical context: org is from bonfire_list_organizations, limit is 1-200 with default 50, offset is 0-based, and these are client-side pagination over a complete RSS feed. This meaningfully augments the schema.

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

Purpose5/5

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

Description clearly states the tool lists currently-OPEN solicitations on Bonfire via RSS. It specifies the source (Bonfire), the scope (open), and the method (keyless RSS), distinguishing it from other government opportunity tools like SAM.gov or Grants.gov.

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

Usage Guidelines4/5

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

Explicitly states that the tool is keyless and requires an org slug from bonfire_list_organizations. It also clarifies that the RSS is the complete set and errors are thrown. However, it does not explicitly compare to sibling opportunity search tools like sam_search_opportunities or opengov_search_solicitations, which would help an agent choose between them.

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

cbp_border_wait_timesA
Read-only

Live CBP land-border-port wait times — current commercial-vehicle (freight-truck) crossing delays at every US Canadian- and Mexican-border port (keyless; bwt.cbp.gov). The FREIGHT / LOGISTICS situational-awareness lane: per-port commercial-vehicle standard + FAST lane delay (minutes), operational status, open-lane count, and maximum lanes — passenger/pedestrian lanes are NOT surfaced (freight lane only). Filters (optional, applied CLIENT-SIDE over the full fetched port set — the feed has NO server-side filter; an empty-string value is reported in _meta.filtersDropped, not applied): border (case-insensitive substring, 'Canadian'/'Mexican'), portName (substring, e.g. 'Laredo'); limit/offset pagination. Each row: { portNumber, portName, crossingName, border, portStatus (Open/Closed), asOf, commercialVehicle:{ maxLanes, standard:{operationalStatus, delayMinutes, lanesOpen, updateTime}, fast:{…} } }. HONESTY: this is REAL-TIME operational data — each lane carries its own updateTime (surfaced verbatim; freshness never implied live-to-the-second); delayMinutes/lanesOpen are number|null (a real 0 stays 0; an empty/N/A value — e.g. a closed lane — is null, NEVER a fabricated 0, because a closed lane's delay is UNKNOWN, not zero); the API returns the WHOLE port set so totalAvailable is the EXACT matched-port count; an outage/4xx/timeout THROWS and a non-array body ⇒ schema_drift (never a fake empty).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax ports returned (default 100, max 200).
borderNoFilter by border — case-insensitive substring, e.g. 'Canadian' or 'Mexican' (the feed labels ports 'Canadian Border' / 'Mexican Border').
offsetNoZero-based page offset (default 0).
portNameNoFilter by port name — case-insensitive substring, e.g. 'Laredo', 'Detroit'.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes far beyond annotations by detailing null handling (0 stays 0, closed lanes are null), update time freshness, response integrity (throws on errors, no fake empties), and the _meta field. This provides deep behavioral 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?

The description is lengthy but well-structured with front-loading of the core purpose and subsequent sections for details. Every sentence adds value, though slight trimming could improve conciseness without losing content.

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?

Given the complexity of real-time operational data with null handling, client-side filtering, and no output schema, the description is remarkably complete. It explains the data structure, null semantics, error behavior, and metadata, leaving no critical gaps.

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?

The schema already has 100% parameter descriptions. The description adds critical context: filters are applied client-side, no server-side filter, empty string reported in _meta.filtersDropped, and pagination via limit/offset. This adds meaningful semantics beyond schema.

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

Purpose5/5

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

The description clearly states the tool provides live CBP land-border-port wait times for commercial vehicles at US Canadian and Mexican border ports, using specific verbs ('Live wait times') and resource ('CBP land-border-port'). It is unique among siblings, which are unrelated government data tools.

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 explicitly states it is for freight/logistics situational awareness and notes that passenger lanes are not surfaced. While it does not explicitly state when not to use, it provides clear context about its scope and limitations, guiding appropriate use.

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

census_business_patternsA
Read-only

Market sizing by NAICS × geography — establishments, employment, and annual payroll from the US Census County Business Patterns (CBP) API (api.census.gov/data/{year}/cbp). ★REQUIRES a free CENSUS_API_KEY: the Census Data API has NO keyless tier, so without the key this tool THROWS an honest config error (get one at https://api.census.gov/data/key_signup.html; call api_key_status to see every source's key requirement). Input: optional naics (2–6 digit NAICS-2017, e.g. '5415'; omit to aggregate all sectors), geography (us|state|county, default us; county REQUIRES state), state (2-digit FIPS, e.g. '06'), year (default '2023'), optional limit (client-side top-N; CBP has no server pagination). Returns { rows:[{ name, geoId, naicsCode, naicsLabel, establishments, employees, annualPayrollUsd, state }] } + honest _meta. HONESTY: establishments/employees are integer counts and annualPayrollUsd is annual US dollars (×1000 from the source's $1,000-unit PAYANN); large-negative suppression sentinels map to null — NEVER a negative number and NEVER 0 (a genuine 0 stays 0; note CBP primarily uses noise-infusion + suppression flags, surfaced as reported — see the tool's suppression note); geoId/naicsCode/state are STRINGS (leading zeros survive). CBP returns the COMPLETE geography set for the filter (no pagination) ⇒ totalAvailable = the row count, complete:true. A missing/invalid key ⇒ invalid_input (a 302 to the Missing-Key page); a header-only body ⇒ honest empty (returned:0); a 5xx ⇒ THROWS; a 200 non-JSON ⇒ schema_drift. The key rides ONLY in the &key= query param — never logged or echoed.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoThe CBP data year (default '2023', the latest published vintage — CBP is released with a ~2-year lag). Validated ^\d{4}$ (it rides in the request path).
limitNoOPTIONAL client-side top-N cap on the returned rows. CBP has NO server-side pagination, so this slices AFTER the full set is fetched and DISCLOSES the omission (totalAvailable stays the full count). Omit to return every matching row.
naicsNoA NAICS-2017 code (2–6 digits), e.g. '5415' (Computer Systems Design & Related Services) or '54' (Professional/Scientific/Technical). Omit to aggregate across all sectors. Validated ^\d{2,6}$.
stateNoA 2-digit state FIPS code, e.g. '06' (California), '48' (Texas). Optional filter for geography='state'; REQUIRED for geography='county' (the CBP `in=state:` predicate). Validated ^\d{2}$.
geographyNoThe geography level (default 'us'). 'state' returns one row per state (or a single state when `state` is given); 'county' returns every county in a state and REQUIRES `state`.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the annotations (readOnly, openWorld) by detailing suppressed data handling (negative sentinels map to null), error behavior (missing key → invalid_input, 5xx → throws), return format, and pagination (complete results). This adds substantial context for safe usage.

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 thorough but well-structured: purpose first, then key requirement, parameters, return format, honesty notes, error cases. While slightly long, every sentence contributes value. Front-loading the main purpose makes it efficient.

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?

Given the complexity (5 params, no output schema), the description is remarkably complete. It covers return structure, suppression behavior, error modes, key requirement, and pagination. Nothing essential is missing for a data query tool with readOnly and openWorld hints.

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

Parameters5/5

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

All 5 parameters have schema descriptions (100% coverage), and the description adds significant extra meaning: explains defaults (year='2023'), validations (naics ^\d{2,6}$), required combinations (state for county), and the client-side nature of limit. This enhances the schema's information.

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: 'Market sizing by NAICS × geography — establishments, employment, and annual payroll from the US Census County Business Patterns (CBP) API'. It identifies the specific resource, verb, and dimensions, distinguishing it from sibling tools like geocoding or FRED queries.

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

Usage Guidelines5/5

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

Explicit guidance is provided: requires a free CENSUS_API_KEY, parameters are explained (naics, geography, state, year, limit), and it instructs users to call api_key_status to check key requirements. It also clarifies when not to use (e.g., no key throws error) and mentions alternatives implicitly by focusing on this dataset.

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

census_geocode_addressA
Read-only

Resolve a one-line US address → its matched address(es) + the Census GEOGRAPHIES that drive set-aside / place-of-performance analysis (US Census Geocoder, keyless; geocoding.geo.census.gov/geocoder/geographies/onelineaddress) — the NEW territory/geospatial domain. Input address (≤500 chars), optional benchmark (default Public_AR_Current) / vintage (default Current_Current). Returns { matches:[{ matchedAddress, coordinates:{x,y}, tigerLineId, addressComponents, geographies:{ state, county, congressionalDistrict, censusTract, censusBlock, place, cbsaOrCsa, stateLegislativeUpper, stateLegislativeLower } }], matchCount, vintageResolved } + honest _meta. Each geography = { layerKey (the RAW vintage-versioned key, e.g. '119th Congressional Districts'), geoid (a STRING — leading zeros survive: '0102'), name }. HONESTY: genuine-empty (addressMatches:[]) ⇒ matchCount:0/complete:true (NOT an error; verify spelling + add city/state/ZIP); MULTIPLE matches are ALL surfaced (each with its own geographies) + a note; a historical vintage can return >1 layer per type (e.g. 111th+113th Congressional Districts with DISTINCT GEOIDs for a redistricted place) ⇒ BOTH surfaced (chosen + alternates[]) + a mandatory note (NEVER silently dropped); the resolved benchmark/vintage is echoed + a 'Current is a MOVING vintage' note; an invalid/missing benchmark/vintage ⇒ HTTP 400 THROWS (never a fake empty); an outage/5xx ⇒ THROWS. MANDATORY CAVEAT every response: these are a NOMINAL input, NOT an authoritative HUBZone / Opportunity-Zone / set-aside determination (those require SBA's HUBZone map / Treasury's OZ-tract list). Feed censusTract.geoid / county.geoid onward to those authoritative sources.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesA one-line US address, e.g. '600 Dexter Ave, Montgomery, AL 36104'. An unmatched/under-specified address is NOT an error — it returns matches:[] / matchCount:0 (a genuine empty; add city, state, ZIP). An ambiguous address may return MULTIPLE matches, each with its own matchedAddress + geographies.
vintageNoGeography vintage (default Current_Current — a MOVING vintage; the same address may return a different tract/CD across cycles). The valid vintage set DEPENDS on the benchmark (a matrix — this enum is the UNION across all four benchmarks); an incompatible (benchmark, vintage) pair fails-closed with an HTTP 400 (invalid_input), never a silent mis-resolution. e.g. Census2020_Census2020 (with Public_AR_Census2020), Census2010_Current.
benchmarkNoAddress-range benchmark (default Public_AR_Current — a MOVING benchmark). One of Public_AR_Current / Public_AR_ACS2025 / Public_AR_LUCA / Public_AR_Census2020. vintage MUST be compatible with this benchmark (a matrix); an incompatible pair fails-closed with an HTTP 400.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description details genuine empty returns, multiple matches, historical vintage behavior, HTTP 400 throws, and mandatory caveats. No contradictions with annotations.

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?

Well-structured with front-loaded purpose, parameter details, return shape, edge cases, and caveats. Slightly long but every sentence adds value; could be slightly more organized.

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

Completeness5/5

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

No output schema, but description fully covers return structure (matches with fields) and all behavioral aspects. Thoroughly compensates for missing schema given tool complexity.

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

Parameters5/5

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

Adds meaning beyond schema: examples for address, explains default/compatibility matrix for vintage and benchmark, behavior for incompatible pairs. Schema coverage is 100% but description enriches understanding.

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 it resolves a one-line US address to matched addresses and Census geographies for set-aside/place-of-performance analysis. It specifies the domain and distinguishes itself from siblings, none of which are geocoding tools.

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

Usage Guidelines5/5

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

Explicitly tells when to use (resolving addresses for geographies) and when not (not authoritative for HUBZone/OZ determinations, requires SBA map/Treasury list). Provides guidance on handling empty results, multiple matches, and invalid inputs.

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

census_geographies_by_coordinatesA
Read-only

Resolve a longitude/latitude point → the Census GEOGRAPHIES at that point, no address parsing (US Census Geocoder, keyless; geocoding.geo.census.gov/geocoder/geographies/coordinates). For a caller that already holds coordinates. Input longitude/x (required, -180..180) + latitude/y (required, -90..90) — x=longitude, y=latitude (the Census API's own names; longitude/latitude are the clearer aliases), optional benchmark/vintage. Returns { found, coordinates:{x,y}, geographies:{ state, county, congressionalDistrict, censusTract, censusBlock, place, cbsaOrCsa, stateLegislativeUpper, stateLegislativeLower }, vintageResolved } + honest _meta. HONESTY: a point outside any US Census geography (offshore / out-of-US) ⇒ geographies all null / found:false / complete:true (an honest empty geographies:{}, NOT an error); coordinate finiteness is re-guarded PRE-fetch (a non-finite x/y ⇒ invalid_input, 0 fetch); a historical vintage's >1-layer-per-type is surfaced with alternates[] + a note (same [B1] multi-key handling as the address tool); GEOIDs are STRINGS (leading zeros survive); the resolved benchmark/vintage is echoed + a moving-vintage note; a bad benchmark/vintage ⇒ HTTP 400 THROWS; an outage/5xx ⇒ THROWS. MANDATORY CAVEAT every response: these are a NOMINAL input, NOT an authoritative HUBZone / Opportunity-Zone / set-aside determination.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoLongitude — the Census API's own name for longitude (alias of `longitude`).
yNoLatitude — the Census API's own name for latitude (alias of `latitude`).
vintageNoGeography vintage (default Current_Current — a MOVING vintage; the same address may return a different tract/CD across cycles). The valid vintage set DEPENDS on the benchmark (a matrix — this enum is the UNION across all four benchmarks); an incompatible (benchmark, vintage) pair fails-closed with an HTTP 400 (invalid_input), never a silent mis-resolution. e.g. Census2020_Census2020 (with Public_AR_Census2020), Census2010_Current.
latitudeNoLatitude (y), a finite number in [-90, 90]. Alias of `y`. e.g. 32.377612.
benchmarkNoAddress-range benchmark (default Public_AR_Current — a MOVING benchmark). One of Public_AR_Current / Public_AR_ACS2025 / Public_AR_LUCA / Public_AR_Census2020. vintage MUST be compatible with this benchmark (a matrix); an incompatible pair fails-closed with an HTTP 400.
longitudeNoLongitude (x), a finite number in [-180, 180]. Alias of `x`. e.g. -86.301883.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already provide readOnlyHint and openWorldHint, but the description adds extensive behavioral details: honesty about null geographies for non-US points, coordinate finiteness check, vintage handling with alternates, GEOIDs as strings, moving vintage warnings, and mandatory caveats. No contradictions.

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 thorough but somewhat verbose, with sections like 'HONESTY:' that could be integrated more concisely. It is front-loaded with the purpose, which is good, but could be tighter.

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?

Given the complexity (6 parameters, no output schema), the description is very complete. It covers edge cases (offshore, historical vintage, bad benchmark), mandatory caveats, and explains the return structure with geographies keys.

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

Parameters4/5

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

Schema description coverage is 100%, baseline 3. The description adds value by explaining the x/y aliases, giving examples, and clarifying benchmark/vintage compatibility and defaults.

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 resolves a longitude/latitude point to Census geographies, and distinguishes itself from address-based geocoding (sibling census_geocode_address). The verb 'resolve' and resource 'Census GEOGRAPHIES' are specific.

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 explicitly says 'no address parsing' and 'for a caller that already holds coordinates', indicating when to use. However, it does not explicitly compare to alternatives or state when not to use, though the implication is clear.

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

cisa_kev_lookupA
Read-only

Filter the CISA Known Exploited Vulnerabilities (KEV) catalog standalone (keyless; www.cisa.gov feed, cached) — the mandatory-remediation list carrying BINDING due-dates under BOD 22-01 / its 2026 successor BOD 26-04. Works even when NVD is rate-limited (a separate host, no key). Filters (all optional, AND-combined, client-side): cveId (exact KEV membership check), vendorProject/product (case-insensitive substring), ransomwareOnly (knownRansomwareCampaignUse === 'Known'), addedSince/dueBefore (ISO YYYY-MM-DD); limit (≤1000, def 100), offset. Returns { catalogVersion, dateReleased, count, found?, matches:[{ cveID, vendorProject, product, vulnerabilityName, dateAdded, dueDate, knownRansomwareCampaignUse, shortDescription, requiredAction, cwes, nvdUrl }] } + honest _meta. ★HONESTY: knownRansomwareCampaignUse and requiredAction are surfaced VERBATIM (never defaulted); dueDate is the CISA-mandated remediation deadline. A cveId NOT in the catalog ⇒ found:false — but the not-in-KEV≠safe caveat rides on EVERY response: KEV is a CURATED SUBSET of confirmed in-the-wild exploitation, so absence means CISA has not catalogued it, NOT that the component is unexploited/safe. A catalog download failure / floor-fail / count-drift THROWS (a truncated/near-empty catalog must never read as 'nothing is exploited') — never a fake-empty. The snapshot freshness (catalogVersion + release date + cache age) is disclosed.

ParametersJSON Schema
NameRequiredDescriptionDefault
cveIdNoExact CVE identifier CVE-YYYY-NNNN to check for KEV membership. A miss returns found:false + the not-in-KEV≠safe caveat (absence is NOT a safety clearance).
limitNoMax matches returned (default 100, max 1000).
offsetNoZero-based page offset (default 0).
productNoCase-insensitive substring filter on the product (e.g. 'Log4j', 'Exchange Server').
dueBeforeNoKeep only entries with dueDate < this ISO date (YYYY-MM-DD) — the CISA-mandated remediation deadline.
addedSinceNoKeep only entries with dateAdded >= this ISO date (YYYY-MM-DD).
vendorProjectNoCase-insensitive substring filter on the vendor/project (e.g. 'Microsoft', 'Apache').
ransomwareOnlyNoWhen true, keep only entries with knownRansomwareCampaignUse === 'Known'.

TDQS

A4.5/5.0
Behavior5/5

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

The description extensively discloses behavior beyond annotations: caching, honesty in field values, failure mode (throws on catalog errors, no fake-empty), and the persistent caveat. This adds significant value beyond readOnlyHint and openWorldHint.

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 verbose (multiple paragraphs with details about failure modes and honesty). While informative, it could be more concise. The key purpose is front-loaded, but the length exceeds what is strictly necessary for typical usage.

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?

The description is remarkably complete given the tool's complexity: it details all 8 optional parameters, describes the response structure (including fields and caveat), failure modes, and the open-world assumption. No gaps remain for an agent to invoke correctly.

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?

Although schema coverage is 100%, the description adds meaningful elaboration: explains cveId returns found:false with caveat, dueBefore as CISA deadline, and other filters' behavior. This provides extra clarity beyond the schema alone.

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 filters the CISA KEV catalog, distinguishing it from general CVE lookups. It specifies the resource (KEV catalog), action (filter), and unique characteristics (keyless, cached, separate host from NVD).

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

Usage Guidelines4/5

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

The description provides explicit context: use when checking KEV membership, works without NVD key, and includes the critical caveat that absence from KEV does not imply safety. It doesn't list alternative tools but implies full CVEs via sibling names.

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

ckan_discover_datasetsA
Read-only

Find CKAN datastore resource ids by keyword via package_search (keyless). Input host (allowlisted enum), q (e.g. 'procurement', 'checkbook'), limit (≤100, def 20). Returns per-resource rows [{ resourceId, name, datasetTitle, format, datastoreActive }] + totalAvailable = the matching DATASET count. Feed a datastoreActive:true result's resourceId to ckan_query (a datastoreActive:false resource is a raw file blob NOT in the datastore, not queryable).

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesKeyword(s) to find datasets, e.g. 'procurement', 'checkbook', 'vendor'.
hostYesWhich allowlisted CKAN portal to query (curated .gov hosts — the SSRF host allowlist, no free host): data.ca.gov (CA), data.virginia.gov (VA — eVA), data.boston.gov (City of Boston Checkbook).
limitNoMax datasets (packages) to return, 1..100, default 20.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint:true, but the description adds valuable behavioral context: it is keyless, returns specific fields like resourceId and datastoreActive, warns that datastoreActive:false resources are raw file blobs not in the datastore, and mentions the totalAvailable count. No contradictions with 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 concise yet packed with all necessary information: purpose, inputs with examples, output format, and usage guidance. Each sentence serves a distinct purpose, and critical details are front-loaded. No extraneous content.

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?

Given the tool's complexity (3 parameters, no output schema), the description fully covers what the tool does, how to use it, and what the returned data means (including datastoreActive flag). It provides enough context for an agent to correctly invoke the tool and interpret results without additional documentation.

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?

With 100% schema description coverage, baseline is 3. The description adds extra value beyond the schema by providing example values for q (e.g., 'procurement'), clarifying the enum meanings for host (allowlisted .gov portals), and specifying the limit default (20) and maximum (100). It also notes 'keyless' operation, which is not in the schema.

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

Purpose5/5

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

The description clearly states the action: 'Find CKAN datastore resource ids by keyword via package_search (keyless).' It distinguishes itself from the sibling tool ckan_query by indicating that results should be fed to ckan_query for actual data querying. Also, specific host enums and example keywords like 'procurement' and 'checkbook' make the purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides explicit input instructions for host, q, and limit, and advises to feed a datastoreActive:true result's resourceId to ckan_query. It implies when to use this tool (to discover datasets) and how to proceed, but does not explicitly compare with other sibling tools like socrata_discover_datasets. However, the guidance is sufficient for proper usage.

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

ckan_queryA
Read-only

Query rows from an allowlisted CKAN datastore resource (keyless; the FIRST source on the R2 DataSource port — state/city spend/checkbook/procurement/vendor tables on the identical CKAN Action API). Input host (curated allowlist enum — the SSRF host guard: data.ca.gov, data.virginia.gov, data.boston.gov), resourceId (36-char lowercase UUID, from ckan_discover_datasets), optional q (full-text), filters (constrained object {field:value} we JSON.stringify), sort, limit (≤1000, def 100), offset. HONESTY: CKAN's envelope carries a real result.total — the DEFAULT is an EXACT total (exact totalAvailable + hasMore); the rare estimated total (total_was_estimated:true) is disclosed via totalIsEstimated + a note and does NOT drive pagination (it can be above OR below the truth). Genuine-empty ⇒ complete:true/total:0; an outage/404/409 or success:false THROWS (never a fake empty). Values are typed per result.fields[].type.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoOptional full-text search across the record (CKAN `q`).
hostYesWhich allowlisted CKAN portal to query (curated .gov hosts — the SSRF host allowlist, no free host): data.ca.gov (CA), data.virginia.gov (VA — eVA), data.boston.gov (City of Boston Checkbook).
sortNoOptional sort, e.g. '_id asc' or 'amount desc'. A bad field ⇒ 409 ⇒ invalid_input.
limitNoRows per page, 1..1000, default 100.
offsetNo0-based row offset for pagination, default 0.
filtersNoOptional structured field filters, e.g. {"Fiscal Year":"2013-2014"}. A constrained object (string/number/array values only) that we JSON.stringify; a bad field ⇒ upstream HTTP 409 ⇒ invalid_input (surfaced, never silent).
resourceIdYesThe datastore resource_id, a 36-char lowercase UUID e.g. 'bb82edc5-9c78-44e2-8947-68ece26197c5' (from ckan_discover_datasets, a datastoreActive:true resource).

TDQS

A4.3/5.0
Behavior5/5

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

Annotations provide readOnlyHint and openWorldHint, but the description greatly expands with details on result.total behavior, total_was_estimated flag, empty vs error handling, SSRF host guard, and value typing. No contradiction with annotations.

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 long and packed with detail, but some content is verbose and technical (e.g., 'keyless; the FIRST source on the R2 DataSource port'). It could be condensed without losing essential information. Front-loading is somewhat present with the main purpose stated first.

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?

Without an output schema, the description explains result.total and totalIsEstimated, but does not fully specify the return structure beyond value typing. It covers error cases, pagination, and limitations. Almost complete but missing explicit output field list.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds significant meaning beyond descriptions: explains q as full-text, filters as structured object with JSON.stringify, limit cap, offset default, sort error behavior, host enum details, and resourceId format. Every parameter benefits.

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 it queries rows from an allowlisted CKAN datastore resource, specifying the host and resourceId constraints, and ties to sibling ckan_discover_datasets. It distinctively focuses on CKAN government data portals, differentiating from siblings like socrata_query or cms_query_dataset.

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 use for querying government CKAN data but does not explicitly state when to use vs alternatives. It mentions 'keyless; the FIRST source on the R2 DataSource port', which is not helpful for an agent. No clear when-not-to-use or alternative guidance.

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

clinicaltrials_facet_countsA
Read-only

Aggregate/statistical view: EXACT per-value STUDY counts over the WHOLE ClinicalTrials.gov registry for one or more whitelisted ENUM fields (keyless; clinicaltrials.gov/api/v2/stats/field/values) — the DISTRIBUTION sibling of clinicaltrials_search_studies (which gives the exact FILTERED total for a query). Input fields: 1..11 ENUM fields (deduped) — OverallStatus, StudyType, Phase, LeadSponsorClass (★ the funding-SOURCE-class distribution: NIH/FED/OTHER_GOV/INDUSTRY/OTHER/NETWORK/INDIV/UNKNOWN/AMBIG — richer than, and distinct from, the search tool's 4-value funderType filter), Sex, DesignAllocation, DesignPrimaryPurpose, DesignInterventionModel, DesignMasking, DesignObservationalModel, DesignTimePerspective. Module-built comma-joined into fields=<…> (NO raw passthrough). Returns { facets:[{ field, fieldPath, valueType, uniqueValuesCount, missingStudiesCount, returned, truncated, overlapping, values:[{ value, studiesCount }] }] } + honest _meta. HONESTY: each studiesCount/uniqueValuesCount is EXACT (typeof-checked to a NUMBER before num() — a non-number ⇒ schema_drift, NEVER a silent 0); a non-ENUM shape for a whitelisted field (e.g. a BOOLEAN {trueCount,falseCount}) ⇒ schema_drift (never read as empty). [M1] _meta.totalAvailable/returned count DISTINCT FIELD VALUES across the requested facet(s), NOT studies (a mandatory unit note points to facets[].values[].studiesCount / clinicaltrials_search_studies for a study count). These counts cover the ENTIRE registry and are NOT filterable — /stats/field/values rejects query./filter./countTotal/pageSize (HTTP 400) — a scope note cross-links the search tool for filtered totals. The returned<uniqueValuesCount⇒truncated invariant discloses the endpoint's hard 250-value cap the instant it binds (never for these v1 ENUM fields — all complete). Phase is ARRAY-valued (a study can carry several) ⇒ overlapping:true + a not-a-partition note (counts MUST NOT be summed); scalar fields partition the registry minus missingStudiesCount. A high missingStudiesCount ⇒ a note that the shown buckets cover a MINORITY of the registry. MANDATORY CAVEAT every response: a facet count is a distribution over trial REGISTRATIONS, NOT federal awards; LeadSponsorClass is the funding-SOURCE class, not a UEI-keyed award join. An unlisted field ⇒ invalid_input pre-fetch (0 fetch); a 404/400/5xx ⇒ THROWS (never a fake-empty distribution).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYes1..11 ClinicalTrials.gov ENUM facet fields (deduped in-handler): OverallStatus, StudyType, Phase, LeadSponsorClass (★ the funding-SOURCE-class distribution — NIH/FED/OTHER_GOV/INDUSTRY/…, distinct from the search tool's 4-value funderType filter), Sex, DesignAllocation, DesignPrimaryPurpose, DesignInterventionModel, DesignMasking, DesignObservationalModel, DesignTimePerspective. Each returns the EXACT whole-registry per-value study-count distribution. An unlisted field ⇒ invalid_input pre-fetch (0 fetch). Phase is ARRAY-valued (counts OVERLAP — see _meta).

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the annotations (readOnlyHint, openWorldHint) by detailing honesty checks (typeof validation, schema drift), the truncated invariant, overlapping behavior for Phase, missingStudiesCount caveat, error handling (invalid_input pre-fetch, throws for 4xx/5xx), and mandatory caveats. All disclosed behaviors are consistent with the annotations.

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 comprehensive but long (over 500 words), making it somewhat verbose. However, it is well-structured with a clear hierarchy: purpose, input/output, honesty, error handling, caveats. The front-loading of the main purpose and key distinctions helps agents quickly grasp the tool's role.

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?

Given the complexity of the tool and the lack of an output schema, the description provides a complete picture: input constraints, exact output structure (facets array and _meta), error scenarios, and caveats about data interpretation. It references the sibling tool for filtered counts, ensuring agents understand the broader context.

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

Parameters5/5

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

The description adds significant meaning beyond the schema by explaining deduping, module-built comma-joining, the unique semantics of LeadSponsorClass (distinct from the search tool's funderType), and the effect of unlisted fields (invalid_input). It also clarifies that fields must be from the whitelisted ENUM list, complementing the schema's enum definition.

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 defines the tool as an aggregate/statistical view providing exact per-value study counts over the entire ClinicalTrials.gov registry for whitelisted ENUM fields. It distinguishes itself from the sibling tool clinicaltrials_search_studies by calling itself the "DISTRIBUTION sibling" that gives whole-registry counts versus filtered totals.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool (for whole-registry distributions) versus the search tool (for filtered totals) and notes that these counts are not filterable. It cross-links the search tool for filtered counts, providing clear guidance on alternatives.

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

clinicaltrials_get_studyA
Read-only

Fetch ONE clinical study by its NCT id (keyless; clinicaltrials.gov/api/v2/studies/{nctId}). Input nctId (the form NCT followed by exactly 8 digits, e.g. NCT02403869 — validated before the path is built, injection-safe). Returns { found, nctId, study:{ …the FULL curated entity record INCLUDING briefSummary… } } + honest _meta. A nonexistent id ⇒ HTTP 404 ⇒ found:false / study:null (NEVER a fabricated record). HONESTY: a registered trial is NOT a federal award and leadSponsor.name is FREE TEXT (not a UEI) ⇒ a NOMINAL name match only (disclosed every response); a 200 body missing protocolSection ⇒ schema_drift; an outage/5xx ⇒ THROWS.

ParametersJSON Schema
NameRequiredDescriptionDefault
nctIdYesNCT id — the form NCT followed by exactly 8 digits (e.g. NCT02403869). Returns the ONE full study record INCLUDING briefSummary; a nonexistent id ⇒ found:false (never a fabricated record). Injection-safe (validated before the path is built).

TDQS

A4.4/5.0
Behavior5/5

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

The description extensively discloses behavioral traits beyond the annotations: return format including found, nctId, study with briefSummary, and _meta; error handling for 404 (found:false, study:null, never fabricated); honesty about leadSponsor.name being free text and nominal matching; plus warnings about schema_drift and outage behavior. This is highly transparent and informative for an agent.

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 well-structured with the purpose front-loaded. It covers parameter details, return structure, error cases, and caveats in a logical order. While slightly verbose due to extensive caveats, every sentence adds value and the conciseness is acceptable for the level of detail needed.

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?

Given no output schema, the description fully describes the return structure (found, nctId, study, _meta) and error handling. It also addresses edge cases (nonexistent ID, schema drift, outage) and provides honesty notes. For a simple get-by-ID tool, this is comprehensive and leaves no critical gaps for agent decision-making.

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

Parameters3/5

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

The input schema already covers the nctId parameter with a detailed description (format, validation, return behavior). The description adds the URL path and restates some of the same information but does not provide substantial new meaning beyond what the schema already conveys. With 100% schema coverage, the baseline is 3, and the description adds only marginal value.

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 starts with 'Fetch ONE clinical study by its NCT id' which clearly specifies the action (fetch) and the resource (clinical study by ID). It distinguishes from sibling tools like clinicaltrials_search_studies by focusing on a single known study. The verb-resource combination is precise and 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 implies usage for retrieving a single study by NCT ID but does not explicitly state when to prefer this over alternatives like clinicaltrials_search_studies. It provides clear context about ID format validation and injection safety, but lacks an explicit when-to-use or when-not-to-use statement. Baseline 4 for clear context without exclusions.

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

clinicaltrials_search_studiesA
Read-only

Search federally-registered clinical-research studies with LEAD-SPONSOR / COLLABORATOR / ORGANIZATION / FUNDING-SOURCE entity enrichment (keyless; clinicaltrials.gov/api/v2/studies) — the trial-REGISTRATION axis of the research-funding entity layer (the sponsor/collaborator NAMES overlap the pharma/biotech/university/agency entities in NIH RePORTER / NSF Awards / SAM / USAspending). LIVE-CONFIRMED-narrowing filters ONLY, module-built into a URLSearchParams query (NO raw passthrough): query.term (broad free-text), sponsor (→query.spons — a fuzzy sponsor NAME search), condition (→query.cond), location (→query.locn), overallStatus (a frozen 14-value enum → filter.overallStatus), funderType (a frozen 4-value enum nih/fed/industry/other → aggFilters — the FEDERAL-funding axis), pageSize (1..1000, def 20), pageToken (the OPAQUE cursor). Returns { studies:[{ nctId, briefTitle, orgStudyId, organization:{ name, class }, leadSponsor:{ name, class }, collaborators:[{ name, class }], fundingClass, overallStatus, startDate, studyType, phases, conditions }] } (briefSummary EXCLUDED — use clinicaltrials_get_study) + honest _meta. HONESTY: countTotal=true is ALWAYS sent ⇒ totalAvailable = the EXACT filter-respecting UNCAPPED total (NEVER studies.length; a missing/non-number totalCount ⇒ schema_drift; a genuine 0 ⇒ 0, never null); pagination is an OPAQUE cursor (offset/nextOffset null; nextCursor = nextPageToken passed back verbatim as pageToken; terminal = token absent; a bad token ⇒ HTTP 400 THROWS). funderType is re-validated IN the handler — an UNLISTED value silently returns totalCount:0 at HTTP 200 (a fake-empty trap) ⇒ invalid_input pre-fetch (0 fetch); funderType is an OVERLAPPING facet (counts MUST NOT be summed). A MULTI-WORD query.term/sponsor/condition is AND-conjunctive (ALL tokens must co-occur — disclosed). A registered trial is NOT a federal award and leadSponsor.name is FREE TEXT (not a UEI) ⇒ a NOMINAL name match only (disclosed every response). Genuine-empty (totalCount:0, no token) ⇒ complete:true/total:0; a bad overallStatus/pageToken/nctId ⇒ HTTP 400/404 THROWS; an outage/5xx ⇒ THROWS (never a fake empty). Feed a row's nctId to clinicaltrials_get_study for the full record + briefSummary.

ParametersJSON Schema
NameRequiredDescriptionDefault
sponsorNoLead-sponsor / collaborator NAME search (→ query.spons; a fuzzy full-text name search, NOT an exact-entity join — the name is free text, not a UEI). MULTI-WORD is AND-conjunctive. LIVE-CONFIRMED to narrow. e.g. 'Pfizer'.
locationNoStudy-location filter (→ query.locn), e.g. a country or city. LIVE-CONFIRMED to narrow. e.g. 'Germany'.
pageSizeNoStudies per page, 1..1000, default 20 (ClinicalTrials.gov clamps a larger request to 1000).
conditionNoCondition / disease filter (→ query.cond). MULTI-WORD is AND-conjunctive. LIVE-CONFIRMED to narrow. e.g. 'diabetes'.
pageTokenNoOpaque continuation cursor — pass back the _meta.nextCursor from the previous page. Pagination is a cursor, NOT a numeric offset (offset/nextOffset are null); nextCursor:null means the last page. A bad token loud-fails at HTTP 400.
funderTypeNoFunding-source facet (→ aggFilters=funderType:<v>) — the FEDERAL-funding axis. A frozen 4-value enum: nih, fed, industry, other (the B2G-relevant nih/fed narrow to federally-sponsored trials). An UNLISTED value silently returns totalCount:0 at HTTP 200 (a fake-empty trap), so it is rejected pre-fetch (invalid_input). funderType is an OVERLAPPING facet — counts MUST NOT be summed into a total.
query.termNoBroad free-text search across the study record. MULTI-WORD is AND-conjunctive — ALL tokens must co-occur ('breast cancer' = breast AND cancer; disclosed in _meta.notes). LIVE-CONFIRMED to narrow. e.g. 'cancer'.
overallStatusNoRecruitment/overall status (→ filter.overallStatus). A frozen 14-value enum (COMPLETED, RECRUITING, TERMINATED, …); an unlisted value LOUD-fails at HTTP 400 upstream, so it is rejected pre-fetch. LIVE-CONFIRMED to narrow. e.g. 'RECRUITING'.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint), the description discloses many behaviors: honesty with countTotal=true, opaque cursor pagination, error handling (bad token throws 400, funderType invalid silently returns 0 but is rejected pre-fetch), AND-conjunctive multi-word queries, and the fact that leadSponsor.name is free text. No contradictions with annotations.

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 long (approximately 500 words) and covers many details. While well-structured and front-loaded with the main purpose, it could be more concise without losing essential information. Some repetition (e.g., 'LIVE-CONFIRMED to narrow' appears multiple times) increases length.

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?

The description is highly complete for a complex search tool with 8 parameters and no output schema. It includes a pseudo-return schema, explains pagination behavior, error cases, and the honesty mechanism. It also references related tools (clinicaltrials_get_study, clinicaltrials_facet_counts) to complete the context.

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

Parameters5/5

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

Schema description coverage is 100%, yet the description adds significant value: for 'sponsor,' it clarifies it's a fuzzy full-text name search (not a UEI); for 'funderType,' it explains the overlapping facet and the trap; for 'query.term,' it states AND-conjunctive behavior. These details are beyond the schema and aid correct parameter usage.

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 it searches federally-registered clinical-research studies with entity enrichment, distinguishing it from clinicaltrials_get_study which returns full records. It specifies the resource (clinicaltrials.gov/api/v2/studies) and the scope (trial-registration axis). The verb 'search' and resource 'studies' are explicit, and it differentiates from related tools like clinicaltrials_get_study.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use this tool versus alternatives, e.g., 'Feed a row's nctId to clinicaltrials_get_study for the full record + briefSummary.' It also states that the tool is for narrowing filters ('LIVE-CONFIRMED-narrowing filters ONLY') and explains that it is not for federal award data ('A registered trial is NOT a federal award'). This helps the agent choose correctly.

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

cms_dmepos_suppliersA
Read-only

Look up Medicare DMEPOS (Durable Medical Equipment, Devices & Supplies) SUPPLIERS — for a given supplier (NPI) or state, the supplier's identity plus aggregate Medicare figures: HCPCS codes billed, beneficiaries served, claims, services, and submitted / Medicare-allowed / Medicare-paid amounts (CMS 'Medicare DMEPOS — by Supplier', keyless; data.cms.gov data-API). The supply-side complement to cms_medicare_provider_services for healthcare-market / competitor / teaming due-diligence on equipment suppliers. Input: npi (10-digit) OR state (2-letter) — at least ONE is REQUIRED (an all-empty query is refused; the supplier table is never scanned unscoped); optional size (1–100, default 25), offset. Returns { suppliers:[{ npi, supplierName, credentials, entityType, city, state, zip, totalHcpcsCodes, totalBeneficiaries, totalClaims, totalServices, submittedCharges, medicareAllowed, medicarePayment }] } + honest _meta. ★HONESTY: totalAvailable is the EXACT count from a SEPARATE stats sub-query (…/data-viewer/stats → found_rows), NEVER the returned-rows length; if that count fails, totalAvailable is null + a disclosing note (never length-faked). offset/size pagination (hasMore = offset+returned < total). Aggregate/payment values are numeric-string → number|null (a genuine 0 stays 0, absent → null, never 0-faked); NPI/entityType/names are null-never-empty-string; supplierName joins Last_Name_Org + First_Name ('Last, First' for individuals, the org name alone for organizations). A genuine no-match ⇒ honest empty (returned:0); a 4xx ⇒ invalid_input/not_found; a 5xx ⇒ THROWS; a 200 non-array/non-JSON ⇒ schema_drift. These are public SUPPLIER-level AGGREGATE figures (no patient identifiers) for ONE annual vintage (disclosed in _meta) — a utilization snapshot, NOT a fraud/quality/fitness determination. KEYLESS — no key is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
npiNoA 10-digit supplier National Provider Identifier (→ Suplr_NPI), e.g. '1003000126'. Provide at least this OR `state`. Validated ^\d{10}$.
sizeNoMax supplier rows to return (1–100, default 25). Offset-paginated.
stateNoA 2-letter US state/territory code (→ Suplr_Prvdr_State_Abrvtn), e.g. 'VA', 'CA'. Provide at least this OR `npi`. Validated ^[A-Za-z]{2}$.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.

TDQS

A4.9/5.0
Behavior5/5

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

Discloses honest count behavior, error handling for 4xx, 5xx, and schema drift, pagination details, numeric-string conversion, naming conventions, and vintage. No contradiction with annotations.

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?

Well-organized with clear sections and front-loaded key info; slightly long but every sentence adds value given the tool's complexity.

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?

Covers return structure, _meta , error handling, data source limitations, and all aspects needed for agent usage despite no output schema.

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

Parameters5/5

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

Schema coverage is 100%, and description adds clarity on required combination, validation patterns, defaults, and pagination behavior beyond schema definitions.

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 'Look up Medicare DMEPOS SUPPLIERS' with specific verb and resource, and distinguishes itself from sibling cms_medicare_provider_services.

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

Usage Guidelines5/5

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

Explicitly specifies required parameters (at least one of npi or state), optional size/offset, and provides context on when to use (supplier-level aggregate figures) and when not (no patient identifiers, not fraud determination). References sibling tool.

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

cms_facility_directoryA
Read-only

Look up Medicare/Medicaid-certified healthcare FACILITIES by type — nursing homes, home health agencies, hospices, or dialysis facilities — with their name, address, city, state, zip, and ownership (CMS provider-data, keyless; data.cms.gov datastore-query API, four datasets). A healthcare-facility directory / market-map lane that generalizes cms_hospital_compare beyond hospitals. Input: facilityType (REQUIRED enum — 'nursing_home' ~14,695 / 'home_health' ~12,460 / 'hospice' ~6,852 / 'dialysis' ~7,490; selects the dataset id via a constant map, the value never enters the URL path), optional state (2-letter, EXACT), facilityName (a name fragment, case-insensitive substring/contains match against the dataset's primary-name column), size (1–100, default 25), offset. Returns { facilities:[{ name, address, city, state, zip, facilityType, ownership }] } + honest _meta. ★HONESTY: totalAvailable is the response's EXACT top-level count for the filter set, NEVER the returned-rows length; offset/size pagination (hasMore = offset+returned < count). name/address/ownership column names DIFFER across the four datasets, so each is COALESCED over per-dataset candidates (name: provider_name/facility_name/legal_business_name; address: address/provider_address/address_line_1; ownership: ownership_type/type_of_ownership/profit_or_nonprofit) — a field absent in the chosen dataset is null (unknown), NEVER an empty string and NEVER fabricated. facilityType is echoed on each row. A genuine no-match ⇒ honest empty (returned:0); an invalid facilityType ⇒ invalid_input (blocked by the enum); a 4xx ⇒ invalid_input/not_found; a 5xx ⇒ THROWS; a 200 non-array body or one missing count/results ⇒ schema_drift. Filters are applied SERVER-SIDE (AND-combined) — nothing is silently dropped. This is a facility directory, NOT a clinical-quality or fitness determination. KEYLESS — no key is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoMax facility rows to return (1–100, default 25). Offset-paginated.
stateNoAn optional 2-letter US state/territory code (→ state, EXACT match), e.g. 'VA', 'TX'. Validated ^[A-Za-z]{2}$.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
facilityNameNoAn optional facility-name fragment (case-insensitive SUBSTRING/contains match against the dataset's primary-name column). Allowed: letters/digits/space/& . , ( ) / ' - (≤100 chars).
facilityTypeYesREQUIRED — which CMS provider-data dataset to search: 'nursing_home' (~14,695), 'home_health' (~12,460), 'hospice' (~6,852), or 'dialysis' (~7,490). Selects the dataset id via a constant map (the value never enters the URL path).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds extensive behavioral details: honest pagination with totalAvailable from count, coalescing of column names across four datasets, handling of missing fields (null, never empty string), error responses (no-match → empty, invalid input → invalid_input, 4xx/5xx behavior), server-side AND filtering, and keyless access. No contradiction with annotations.

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 quite verbose (multiple paragraphs with technical details like URL path behavior and column coalescing). While well-structured and front-loaded with core purpose, it could be more concise for quick scanning. Every sentence adds value, but length may hinder readability.

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?

Given the tool's complexity (multi-dataset, pagination, coalescing), the description is remarkably complete. It covers return format, honest pagination, error handling, field behavior, and keyless access. No output schema exists, so the description compensates fully.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. The description adds value beyond schema: provides counts for each facilityType enum, explains that the value selects a dataset id via constant map, describes state validation regex, and clarifies facilityName as case-insensitive substring match. This enhances parameter understanding.

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: to look up Medicare/Medicaid-certified healthcare facilities by type, returning name, address, city, state, zip, and ownership. It distinguishes itself from siblings by noting it generalizes cms_hospital_compare beyond hospitals.

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

Usage Guidelines4/5

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

The description provides explicit input requirements (facilityType required, optional state, facilityName, size, offset) and states that it is a facility directory, not a clinical-quality tool. It hints at alternatives by mentioning it generalizes cms_hospital_compare, but does not explicitly contrast with sibling tools like nppes_lookup_provider.

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

cms_hospital_compareA
Read-only

Look up Medicare-certified hospitals by US state and/or facility-name fragment — location, type, ownership, emergency-services flag, and CMS star rating (CMS Hospital Compare 'Hospital General Information', keyless; data.cms.gov provider-data datastore-query API, ~5,432 hospitals). A healthcare-facility directory / market-map lane (WHERE hospitals are and HOW CMS rates them). Input: state (2-letter, EXACT) OR facilityName (a name fragment, case-insensitive substring/contains match) — at least ONE is REQUIRED (an all-empty query is refused; hospitalType alone is NOT enough to scope); optional hospitalType (substring, e.g. 'Acute', 'Critical Access'), size (1–100, default 25), offset. Returns { hospitals:[{ facilityId, facilityName, address, city, state, zip, county, phone, hospitalType, ownership, emergencyServices, overallRating }] } + honest _meta. ★HONESTY: totalAvailable is the response's EXACT top-level count for the filter set (VA=96), NEVER the returned-rows length; offset/size pagination (hasMore = offset+returned < count). overallRating is CMS's 1–5 star rating as a number; 'Not Available'/blank/non-numeric ⇒ null (NEVER 0). emergencyServices normalizes 'Yes'⇒true / 'No'⇒false / else null (never a fabricated false). IDs/names/addresses are null-never-empty-string. A genuine no-match ⇒ honest empty (returned:0); a 4xx ⇒ invalid_input/not_found; a 5xx ⇒ THROWS; a 200 non-array body or one missing count/results ⇒ schema_drift. Filters are applied SERVER-SIDE (AND-combined) — nothing is silently dropped. This is a summary star rating, NOT a clinical-quality or fitness determination. KEYLESS — no key is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoMax hospital rows to return (1–100, default 25). Offset-paginated.
stateNoA 2-letter US state/territory code (→ state, EXACT match), e.g. 'VA', 'CA'. Provide at least this OR `facilityName`. Validated ^[A-Za-z]{2}$.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
facilityNameNoA hospital-name fragment (→ facility_name, case-insensitive SUBSTRING/contains match), e.g. 'children'. Provide at least this OR `state`. Allowed: letters/digits/space/& . , ( ) / ' - (≤100 chars).
hospitalTypeNoAn optional hospital-type filter (→ hospital_type, case-insensitive SUBSTRING/contains match), e.g. 'Acute', 'Critical Access'. Allowed: letters/digits/space/& . , ( ) / ' - (≤100 chars).

TDQS

A4.6/5.0
Behavior5/5

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

The description disclosed all behavioral traits: pagination with honest count, null handling for ratings and emergency services, error handling (4xx, 5xx, schema drift), server-side filtering, and keyless operation. Annotations only provide readOnlyHint and openWorldHint; the description goes far beyond with concrete details.

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 lengthy but well-structured: a concise opening sentence, followed by parameter details, return format, honest behaviors, and error handling. It is front-loaded with the core purpose and uses bullet-like formatting for clarity. While it could be slightly trimmed, every sentence adds necessary detail for a complex tool.

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?

Given the tool's complexity (5 parameters, no output schema but return details described, pagination, null handling), the description is remarkably complete. It covers input constraints, output structure, edge cases, and error conditions, leaving no gap for an agent to misinterpret usage. The absence of an output schema is fully compensated.

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?

The input schema already describes all five parameters with detailed descriptions, achieving 100% coverage. The description adds value by clarifying match semantics (EXACT vs. substring), allowed characters, validation rules, and default values, enhancing agent understanding beyond the schema.

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

Purpose5/5

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

The description clearly states the tool looks up Medicare-certified hospitals by state and/or facility name, detailing the specific fields returned (location, type, ownership, emergency services, star rating). It defines the resource and action precisely, and the scope is well-delineated, making it distinct from sibling CMS tools.

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

Usage Guidelines4/5

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

The description provides explicit constraints: at least one of state or facilityName is required, hospitalType alone is insufficient, and pagination parameters are specified. It does not directly state when not to use the tool or list alternatives, but the constraints are clear enough for effective selection.

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

cms_medicare_provider_servicesA
Read-only

Look up Medicare Part-B provider utilization — for a given provider (NPI) or state, the HCPCS services rendered, beneficiaries served, and submitted / Medicare-allowed / Medicare-paid amounts (CMS 'Medicare Physician & Other Practitioners — by Provider and Service', keyless; data.cms.gov data-API). The demand-side complement to nppes_lookup_provider (who providers ARE → what they BILL) for healthcare-market / competitor / teaming due-diligence. Input: npi (10-digit) OR state (2-letter) — at least ONE is REQUIRED (the table is 9.78M rows; an all-empty query is refused; providerType/hcpcsCode alone are NOT enough to scope); optional providerType (exact CMS specialty, e.g. 'Family Practice'), hcpcsCode (e.g. '97110', 'G0463'), size (1–100, default 25), offset. Returns { services:[{ npi, providerName, credentials, providerType, city, state, zip, hcpcsCode, hcpcsDescription, totalBeneficiaries, totalServices, avgSubmittedCharge, avgMedicareAllowed, avgMedicarePayment }] } + honest _meta. ★HONESTY: totalAvailable is the EXACT count from a SEPARATE stats sub-query (…/data-viewer/stats → found_rows, e.g. VA=278254), NEVER the returned-rows length; if that count fails, totalAvailable is null + a disclosing note (never length-faked). offset/size pagination (hasMore = offset+returned < total). Aggregate/payment values are numeric-string → number|null (a genuine 0 stays 0, absent → null, never 0-faked); NPI/HCPCS/names are null-never-empty-string. A genuine no-match ⇒ honest empty (returned:0); a 4xx ⇒ invalid_input/not_found; a 5xx ⇒ THROWS; a 200 non-array/non-JSON ⇒ schema_drift. These are public PROVIDER-level AGGREGATE figures (no patient identifiers) for ONE annual vintage (the dataset year is disclosed in _meta) — a utilization snapshot, NOT a fraud/quality/fitness determination. KEYLESS — no key is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
npiNoA 10-digit National Provider Identifier (→ Rndrng_NPI), e.g. '1003000126'. Provide at least this OR `state`. Validated ^\d{10}$.
sizeNoMax provider-service rows to return (1–100, default 25). Offset-paginated.
stateNoA 2-letter US state/territory code (→ Rndrng_Prvdr_State_Abrvtn), e.g. 'VA', 'CA'. Provide at least this OR `npi`. Validated ^[A-Za-z]{2}$.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
hcpcsCodeNoAn optional HCPCS/CPT service code filter (→ HCPCS_Cd), e.g. '97110', 'G0463'. Validated ^[A-Za-z0-9]{1,10}$.
providerTypeNoAn optional specialty filter matching the CMS provider type EXACTLY (→ Rndrng_Prvdr_Type), e.g. 'Family Practice', 'Physical Therapist in Private Practice'. Allowed: letters/digits/space/& . , ( ) / ' - (≤100 chars).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide readOnlyHint and openWorldHint. Description adds significant context: keyless API, honest counts (never faked), null handling, error categories, data vintage, aggregate nature. No contradictions.

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?

Description is detailed but well-structured with sections, bullet points, and examples. While lengthy, it is front-loaded with essential info and each sentence adds value. Small gains in conciseness possible.

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 complex tool with 6 parameters, no output schema, but rich constraints, the description covers input requirements, output format, pagination, edge cases, honesty policy, and dataset limitations comprehensively.

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 covers 100% of parameters with descriptions. Description adds validation patterns (\d{10}, ^[A-Za-z]{2}), reinforces at least one required, default size, and pagination details. Exceeds baseline 3.

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 defines the tool as looking up Medicare Part B provider utilization by NPI or state, listing specific fields and the CMS dataset. It distinguishes from sibling 'nppes_lookup_provider' as the demand-side complement. Verb+resource+scope are precise.

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

Usage Guidelines5/5

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

Explicit guidance: when to use (provider billing data, demand-side complement), constraints (at least one of npi/state required; providerType/hcpcsCode alone not enough), pagination, and honest error handling. Clearly differentiates from alternatives.

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

cms_query_datasetA
Read-only

Query a CMS Open Payments DKAN datastore distribution by datasetId + index (keyless; openpaymentsdata.cms.gov) — the healthcare industry-financial-relationship / COI-vetting + market-intelligence lane NPPES (provider identity) cannot answer. GET /api/1/datastore/query/{datasetId}/{index} with server-side conditions filters, an EXACT count, offset/limit pagination, and a properties projection. Returns { datasetId, index, results (mode), fields:[{name,type,mysqlType,description}] (from the DKAN schema), rows:[…verbatim…] } + honest _meta. A confirmed target: 2025 Research Payment Data 'f0d1de67-6852-4093-a036-c9328c256a05' index 0 (count 931959; + a recipient_state='CA' condition → 92097). ★HONESTY: count is the EXACT grand total (P1) → totalAvailable=count + real offset pagination (NOT a page-length lower bound); conditions are server-side and self-policing — a valid column narrows the count, a BAD column ⇒ HTTP 400 ⇒ invalid_input, so filtersDropped is ALWAYS empty (no silent-drop path, P4); limit ≤ 500 is the HARD API cap (a higher limit ⇒ invalid_input, no silent clamp); every column is text, so amounts (total_amount_of_payment_usdollars, …) arrive as STRINGS surfaced verbatim (a missing amount is null-never-0, P3). ★results:false = a COUNT/SCHEMA-discovery mode: no rows, pagination disabled (no livelock), but the EXACT count + every column's schema returned (count=true is ALWAYS on the wire — not a caller toggle). A genuine {count:0} ⇒ honest empty; a 400 (bad column/limit) / 404 (bad datasetId/index) / HTML (SPA/WAF) / 5xx / timeout / a missing schema anchor or non-array results (in results:true) ⇒ THROW (never a fake empty). ★SSRF: datasetId (36-char lowercase UUID) + index interpolate into the URL PATH (validated before interpolation). ★PII: Open Payments is PUBLIC transparency-BY-LAW data (in-scope per the NPPES precedent) naming physicians + amounts verbatim — bounded to targeted vetting (offset ≤ 2000 reach cap), NO enrichment, NO covered_recipient_npi→NPPES auto-join. NOT a conflict-of-interest finding / fitness / exclusion determination — cross-check SAM exclusions + OFAC + the OIG-LEIE. The caveat + reach-cap disclosure ride EVERY response.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNoDistribution index (default 0 = the primary CSV). Also interpolates into the URL path (int 0..50).
limitNoRows per page, 1..500, default 100. 500 is the HARD DKAN cap (the API 400s over it; this tool rejects >500 loudly).
offsetNo0-based row offset (default 0). ★POLICY reach cap ≤ 2000 (a deliberate targeted-lookup boundary — Open Payments names physicians + amounts); offset > 2000 ⇒ invalid_input.
resultsNoDefault true (return rows). Set false for COUNT/SCHEMA-discovery mode: no rows, pagination disabled, but the EXACT count + every column's schema are returned. (`count` is NOT a toggle — count=true is always on the wire.)
datasetIdYesREQUIRED — the DKAN datasetId, a 36-char LOWERCASE UUID. ★SSRF: it interpolates into the URL PATH, so this strict grammar (no uppercase, no %2F/../, no trailing newline) is the load-bearing path-injection guard. e.g. 'f0d1de67-6852-4093-a036-c9328c256a05' (2025 Research Payment Data).
conditionsNoServer-side filters (≤10, AND-combined) that provably narrow the EXACT count. Each either applies or the call errors — filtersDropped is always empty.
propertiesNoOptional column projection (snake_case column names). Omit for all columns.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint and openWorldHint annotations, detailing exact behavior of count (exact grand total), conditions (server-side, self-policing, no silent drop), limit (hard cap 500, error on exceed), error handling (400, 404, HTML, 5xx, timeout, throw), the results mode, SSRF validation, PII disclosure, and the reach cap. No contradictions with annotations.

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 long but well-structured with clear sections (main purpose, honesty details, results mode, error handling, SSRF, PII, caveat). Bold and emoji highlights aid readability. Every sentence provides unique, essential information, but could be slightly more concise without losing value.

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?

Given the complexity (7 parameters, no output schema), the description is fully complete. It covers all return fields (datasetid, index, results mode, fields, rows, _meta), error modes, constraints, security, disclaimers, and provides a concrete example. It leaves no behavioral gaps for an AI agent to infer.

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

Parameters5/5

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

With 100% schema description coverage, the baseline is 3, but the description adds substantial context: index default 0 and path interpolation, limit hard cap and rejection, offset policy cap, results mode explanation, datasetId SSRF validation and example, conditions limit and error behavior, properties optional. These details significantly enhance parameter understanding beyond the schema.

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

Purpose5/5

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

The description explicitly states the tool queries a CMS Open Payments DKAN datastore distribution by datasetId and index, specifies the exact API endpoint, and gives a concrete example dataset. It clearly distinguishes itself from sibling tools like 'treasury_query_dataset' by naming the specific data source and use case (healthcare financial relationships, conflict-of-interest vetting).

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

Usage Guidelines5/5

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

The description provides explicit when-to-use context (healthcare industry-financial-relationship, COI-vetting, market intelligence not answerable by NPPES) and when-not-to (not a conflict-of-interest finding, fitness determination, exclusion determination). It recommends cross-checking with SAM, OFAC, OIG-LEIE, and states the reach cap of offset≤2000 as a deliberate targeted-lookup boundary, offering clear alternatives.

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

cms_revoked_providersA
Read-only

Search CMS's PUBLIC 'Revoked Medicare Providers & Suppliers' list — the legally-published register of Medicare enrollment revocations, with the revoked provider/supplier's identity, provider type, revocation reason, effective date, and re-enrollment-bar expiration (CMS 'Revoked Providers and Suppliers', keyless; data.cms.gov data-API, ~7,059 rows). A vetting / due-diligence lane in the SAME class as the OFAC / SAM-exclusions lists — for screening a counterparty before teaming or subcontracting. Input (ALL optional — the ~7K-row list is safe to page unfiltered): npi (10-digit → NPI), state (2-letter → STATE_CD, exact), lastName (→ LAST_NAME, exact), size (1–100, default 25), offset. Returns { revocations:[{ enrollmentId, npi, name, state, providerType, revocationReason, revocationEffectiveDate, reenrollmentBarExpiration }] } + honest _meta (which notes this is CMS's public revocation/exclusion list — a due-diligence signal, NOT a current-eligibility, guilt, or fitness determination). ★HONESTY: totalAvailable is the EXACT count from a SEPARATE stats sub-query (…/data-viewer/stats → found_rows), NEVER the returned-rows length; if that count fails, totalAvailable is null + a disclosing note (never length-faked). offset/size pagination (hasMore = offset+returned < total). name coalesces ORG_NAME (organizations) else FIRST_NAME + LAST_NAME (individuals) — null if none, never a fabricated empty; NPI/reasons/dates are strings (null-never-empty-string). A genuine no-match ⇒ honest empty (returned:0); a 4xx ⇒ invalid_input/not_found; a 5xx ⇒ THROWS; a 200 non-array/non-JSON ⇒ schema_drift. KEYLESS — no key is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
npiNoAn optional 10-digit National Provider Identifier (→ NPI), e.g. '1003000126'. Validated ^\d{10}$.
sizeNoMax revocation rows to return (1–100, default 25). Offset-paginated.
stateNoAn optional 2-letter US state/territory code (→ STATE_CD, EXACT match), e.g. 'FL', 'CA'. Validated ^[A-Za-z]{2}$.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
lastNameNoAn optional last-name filter (→ LAST_NAME, EXACT match). Allowed: letters/digits/space/. , ' - (≤100 chars).

TDQS

A4.6/5.0
Behavior5/5

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

Provides extensive behavioral details beyond annotations: honest totalAvailable from separate query, no key required, pagination behavior, null handling, error responses. Complements readOnlyHint and openWorldHint with concrete specifics.

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?

Front-loaded with purpose and source, then detailed sections. Though lengthy, each sentence adds value. Well-structured for quick scanning.

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?

Covers all aspects: source, return format, pagination, error handling, data honesty, and use case. No output schema needed; description fully equips agent.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. Description adds meaningful context: explains pagination, notes optionality and safe unfiltered usage, and clarifies exact match for state/lastName.

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

Purpose5/5

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

Clearly states 'Search CMS's PUBLIC Revoked Medicare Providers & Suppliers list' with specific fields returned. Distinguishes from siblings by noting it's in the same class as OFAC/SAM-exclusions lists for vetting/due diligence.

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

Usage Guidelines4/5

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

Explicitly says 'for screening a counterparty before teaming or subcontracting' and notes input is optional with safe unfiltered paging. While it doesn't state when not to use, the context and sibling list make its niche clear.

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

cms_search_datasetsA
Read-only

Discover CMS Open Payments datasets on the keyless DKAN DCAT metastore (openpaymentsdata.cms.gov) — the Physician Payments Sunshine Act transparency catalog (industry→physician/teaching-hospital payments, other transfers of value, ownership interests). Returns { query, results:[{ datasetId, title, description, distributions:[{index, distId, title, mediaType, downloadURL}], keyword, modified }] } + honest _meta. Feed a result's datasetId + a distribution index to cms_query_dataset (use results:false there to enumerate the column schema before pulling rows). Optional q (case-insensitive title/description substring), limit (≤100, def 20), offset. ★HONESTY: the DKAN metastore IGNORES limit/offset/page and returns the ENTIRE catalog in one response, so q/limit/offset are applied CLIENT-SIDE against the in-memory array and totalAvailable is the EXACT post-q catalog size (never fabricated, never null) — hasMore is computed against the KNOWN catalog length (no false-more, no dead-end offset). The flagship targets are '2025 Research Payment Data', the General-Payment, and Ownership datasets. A non-array metastore body / HTML / 5xx / timeout THROWS (never a fake empty). NOT a determination — see cms_query_dataset's caveat.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoClient-side case-insensitive substring filter over each dataset's title + description (the DKAN metastore returns the ENTIRE catalog in one response; q is applied client-side and totalAvailable is the exact post-filter catalog size). e.g. 'research payment'.
limitNoDatasets per page, 1..100, default 20 (client-side slice of the full catalog).
offsetNo0-based pagination offset (default 0), applied client-side against the known catalog length (never a server offset).

TDQS

A4.6/5.0
Behavior5/5

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

The description adds significant behavioral details beyond readOnlyHint annotation: the DKAN metastore ignores server pagination, applies client-side, throws on errors, and never fabricates empty results. This honesty adds value.

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 verbose but well-structured, front-loading purpose and return format, then usage, then caveats. It could be slightly more concise but every sentence adds necessary info.

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?

Given no output schema, the description adequately covers return structure, behavior, edge cases, and links to cms_query_dataset. It also explains the honesty mechanism, making it complete for the task.

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?

All three parameters are documented in the input schema (100% coverage). The description adds context about client-side application and the exactness of totalAvailable, enhancing understanding.

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 discovers CMS Open Payments datasets on the DKAN metastore, specifies the return format, and distinguishes from cms_query_dataset by explaining how to use results.

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

Usage Guidelines4/5

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

The description provides usage guidance, such as feeding datasetId and distribution index to cms_query_dataset, and notes the client-side pagination behavior. However, it lacks explicit when-not-to-use or comparison with other sibling tools.

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

congress_get_billA
Read-only

Fetch ONE Congress.gov bill by id via /v3/bill/{congress}/{billType}/{billNumber} (api.data.gov keyed; DATA_GOV_API_KEY or DEMO_KEY). Input congress (int), billType (enum), billNumber (int). Returns { bill:{…} } + single-record _meta. A nonexistent bill ⇒ not_found (never fabricated).

ParametersJSON Schema
NameRequiredDescriptionDefault
billTypeYesBill type: hr/s/hjres/sjres/hconres/sconres/hres/sres.
congressYesCongress number, e.g. 117.
billNumberYesBill number, e.g. 3076 (for H.R.3076).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true. The description adds valuable context: it specifies the exact API endpoint, the requirement for an API key, the return structure ('{ bill:{…} } + single-record _meta'), and that nonexistent bills result in 'not_found' without fabrication. No contradictions.

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 three sentences. First sentence states the core action and endpoint. Second lists the parameters. Third describes the return shape and error behavior. No unnecessary words, front-loaded, and easy to parse.

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?

Given the tool's simplicity (3 required params, no output schema), the description covers everything needed: what it does, how to call it, parameter names, return structure, error case, and auth requirement. It is fully sufficient for an AI agent to select and invoke correctly.

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?

Input schema covers all parameters with full descriptions (enum values for billType, examples for congress and billNumber). Description restates parameter types and connects them to the URL pattern, but does not add new semantics beyond the schema. Baseline score for 100% coverage is appropriate.

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 'Fetch ONE Congress.gov bill by id via /v3/bill/{congress}/{billType}/{billNumber}'. It specifies the action (Fetch), the resource (Congress.gov bill), and the exact endpoint. This distinguishes it from sibling tools like congress_search_bills, which is for searching.

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 mentions the API key requirement ('DATA_GOV_API_KEY or DEMO_KEY') and the error behavior for nonexistent bills. It does not explicitly state when to use this vs. alternatives, but the context of fetching by ID vs. searching in congress_search_bills is clear. No exclusions or when-not-to-use are given, but it's sufficient.

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

congress_search_billsA
Read-only

Search Congress.gov BILLS/legislation (api.data.gov keyed; DATA_GOV_API_KEY or DEMO_KEY). Input optional congress (e.g. 118), billType (hr/s/hjres/sjres/hconres/sconres/hres/sres — requires congress), fromDateTime/toDateTime (ISO-8601 with offset), offset, limit (≤250, def 20). Returns { bills:[{ congress, type, number, title, originChamber, latestAction, updateDate, url }] } + _meta with totalAvailable = pagination.count (EXACT). NOTE: /v3/bill has no keyword search, so a query arg is NOT applied and is disclosed in _meta.filtersDropped. Outage/4xx THROWS (never a fake empty).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRecords per page, 1..250, default 20.
queryNoKeyword — NOTE: Congress.gov /v3/bill has NO keyword search, so this is NOT applied (disclosed in _meta.filtersDropped). Use congress/billType/date filters instead.
offsetNo0-based record offset for pagination, default 0.
billTypeNoBill type: hr/s/hjres/sjres/hconres/sconres/hres/sres. Requires `congress` (path /v3/bill/{congress}/{billType}).
congressNoCongress number, e.g. 118 (scopes the path to /v3/bill/{congress}).
toDateTimeNoFilter to bills updated at/before this ISO-8601 date-time with offset, e.g. '2024-12-31T23:59:59Z'.
fromDateTimeNoFilter to bills updated at/after this ISO-8601 date-time with offset, e.g. '2024-01-01T00:00:00Z'.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description adds key behavioral details: API key requirement, that outages/4xx throw errors (never fake empty), and that query parameter is dropped. No contradictions with annotations.

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 dense with information but remains single-paragraph and front-loaded with the main purpose. While efficient, a bit more structure (e.g., bullet points) could improve readability, but it is not overly long.

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?

Despite no output schema, the description thoroughly details the return format (bills array with fields + meta with totalAvailable) and error behavior (throws on outage/4xx). Also covers all parameters, key requirement, and pagination. Complete for a search tool.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds significant value beyond schema: explains query is not applied, billType requires congress, ISO-8601 date format examples, limit max 250, default 20, and return structure. This fully compensates and enhances understanding.

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 it is for searching Congress.gov BILLS/legislation, specifying the resource (bills) and action (search). It also distinguishes from potential siblings (like congress_get_bill) by focusing on list/search functionality and noting limitations like no keyword search.

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

Usage Guidelines4/5

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

The description provides guidance on parameter usage, such as requiring congress for billType, explaining that query is not applied and suggesting alternatives (congress/billType/date filters). However, it does not explicitly mention when to use sibling tools like congress_get_bill for single bills.

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

courtlistener_search_opinionsA
Read-only

Search US FEDERAL COURT OPINIONS (case law / litigation) via CourtListener (www.courtlistener.com/api/rest/v4/search, type=o). ★PROVENANCE: the DATA is US federal court PUBLIC RECORDS, but the API is CourtListener, run by the Free Law Project (a NON-PROFIT) — this is NOT a .gov API; CourtListener republishes these records KEYLESS because the .gov primary source (PACER) is PAYWALLED. KEYLESS (anonymous access works; an optional free COURTLISTENER_API_TOKEN only raises the rate limit; get one at https://www.courtlistener.com/help/api/rest/; call api_key_status to see every source's key requirement). All inputs optional: query (full-text → q), court (a court id, ^[a-z0-9]+$ — e.g. 'uscfc' US Court of Federal Claims for contract claims/bid protests, 'cafc' Federal Circuit for contract/patent appeals, 'scotus'), dateFiledAfter/dateFiledBefore (ISO ^\d{4}-\d{2}-\d{2}$ → filed_after/filed_before), natureOfSuit (folded into the q query — no verified dedicated filter, disclosed in notes), cursor (opaque continuation — pass back _meta.nextCursor), order (→ order_by, default 'dateFiled desc'). Returns { opinions:[{ caseName, court, courtId, dateFiled, docketNumber, natureOfSuit, status, judge, citation, absoluteUrl }] } + honest _meta. HONESTY: totalAvailable is the API's REAL count (the total match count for the filter) — NOT the rows on this page; pagination is an OPAQUE CURSOR (offset/nextOffset are null/meaningless — pass _meta.nextCursor back as cursor; nextCursor:null/hasMore:false = last page). CourtListener v4 stops counting on deep cursor pages (count:null) ⇒ totalAvailable:null is DISCLOSED, never faked as results.length. dateFiled is a date STRING; citation may be an array/object ⇒ flattened to a safe string/string[] (never fabricated); judge/natureOfSuit/docketNumber are null when absent (never ''); absoluteUrl is the full https://www.courtlistener.com link. A genuine no-match (results:[]) ⇒ honest empty (returned:0); a 400 (bad param) ⇒ invalid_input surfacing the API's message; a 429 (unauth throttle) ⇒ rate_limited THROWS (Retry-After honored, never routed around); a 5xx/timeout ⇒ upstream_unavailable THROWS; a 200 non-JSON / non-array results / a count that is neither a number nor null ⇒ schema_drift; an off-host next is REFUSED (SSRF). The optional token rides ONLY in the Authorization: Token header (never the URL/_meta).

ParametersJSON Schema
NameRequiredDescriptionDefault
courtNoA CourtListener court id (lowercase alphanumerics ^[a-z0-9]+$), e.g. 'uscfc' (US Court of Federal Claims — contract claims/bid protests), 'cafc' (Federal Circuit — contract/patent appeals), 'scotus'.
orderNoSort order (maps to order_by), default 'dateFiled desc' (most recent first). E.g. 'dateFiled asc', 'score desc'.
queryNoFull-text query (maps to q), e.g. 'bid protest' or a party name. Matches across the opinion text/metadata.
cursorNoOpaque continuation token for the NEXT page — pass back the _meta.nextCursor from the previous response (CourtListener uses CURSOR pagination, not page/offset).
natureOfSuitNoNature-of-suit text — folded into the q full-text query (the v4 opinions search has no verified dedicated filter), so it matches the text anywhere in the document (disclosed in _meta.notes).
dateFiledAfterNoOnly opinions filed on/after this ISO date (→ filed_after), e.g. '2020-01-01'. Validated ^\d{4}-\d{2}-\d{2}$.
dateFiledBeforeNoOnly opinions filed on/before this ISO date (→ filed_before), e.g. '2024-12-31'. Validated ^\d{4}-\d{2}-\d{2}$.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide readOnlyHint and openWorldHint. The description goes far beyond by disclosing data provenance, the non-.gov nature, keyless access, honest pagination (cursor instead of offset), handling of missing fields (null vs ''), error responses (400, 429, 5xx), and SSRF protection. No contradictions with 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?

Despite being long, every sentence is meaningful. The structure is logical: purpose, provenance, parameter details, honesty disclosures, error handling. Information is front-loaded and uses formatting (bold, capitalization) for emphasis.

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

Completeness5/5

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

No output schema, but the description compensates by specifying the return structure (`{ opinions: [...] }`) and explaining error cases. It covers all 7 parameters, behavior, and edge cases, making it fully informative for an AI agent.

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

Parameters5/5

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

Schema coverage is 100%, so baseline is 3. The description adds significant value: explains mapping to API fields (e.g., `query` → q), validation rules, defaults (order: 'dateFiled desc'), usage of cursor as opaque token, and clarifies that natureOfSuit is not a dedicated filter.

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 'Search US FEDERAL COURT OPINIONS (case law / litigation)' and specifies the resource (CourtListener). It provides a specific verb (search) and resource (opinions), with enough detail to distinguish from sibling tools like usas_search_awards or gao_protest_lookup.

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

Usage Guidelines4/5

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

The description gives extensive context: provenance, keyless access, optional token for rate limits, detailed parameter examples (e.g., court='uscfc' for contract claims), and notes on limitations (natureOfSuit folded into query). However, it does not explicitly state when not to use this tool or compare it to alternatives.

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

cpsc_recallsA
Read-only

Look up U.S. CPSC consumer-product RECALLS — the recall title, hazard description, remedy, affected products, manufacturers, retailers, injuries, and country of manufacture (CPSC SaferProducts /RestWebServices/Recall; www.saferproducts.gov). The consumer-goods / import product-safety lane alongside nhtsa_recalls (vehicles) and openfda (medical). KEYLESS — no API key is required or accepted. Inputs (ALL optional): dateStart/dateEnd (YYYY-MM-DD recall date range), productName (substring), manufacturer (substring), recallNumber (a specific CPSC recall number). Returns { recalls:[{ recallNumber, recallDate, title, description, url, products:[names], numberOfUnits, manufacturers:[names], retailers:[names], hazards:[descriptions], remedies:[descriptions], injuries:[names], manufacturerCountries:[names] }] } + honest _meta. HONESTY: the CPSC response is a bare array with NO count field and NO pagination — it returns the COMPLETE matching set, so totalAvailable = the number of returned recalls and complete:true (never a fabricated total). ★With NO filter given, results are bounded to a DEFAULT ~90-day recent window (RecallDateStart, disclosed in _meta.notes) rather than a silent whole-dataset fetch. An empty result ⇒ an HONEST EMPTY (returned:0), NOT an error; a 4xx ⇒ invalid_input; a 5xx/timeout ⇒ THROWS; a 200 non-JSON OR a non-array body ⇒ schema_drift. Nested arrays are flattened to name/description strings (an empty {} object is skipped, never fabricated); NumberOfUnits is free text kept as a string; dates are strings; every scalar is null-never-empty-string. Fixed host www.saferproducts.gov (SSRF-guarded); dates are ^\d{4}-\d{2}-\d{2}$ and recallNumber is letters/digits/hyphen only.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateEndNoRecall date range END (optional), YYYY-MM-DD, e.g. '2025-01-31' (→ RecallDateEnd). Validated ^\d{4}-\d{2}-\d{2}$.
dateStartNoRecall date range START (optional), YYYY-MM-DD, e.g. '2025-01-01' (→ RecallDateStart). Validated ^\d{4}-\d{2}-\d{2}$.
productNameNoProduct name substring filter (optional), e.g. 'helmet' (→ ProductName).
manufacturerNoManufacturer name substring filter (optional) (→ Manufacturer).
recallNumberNoA specific CPSC recall number (optional), e.g. '25088' (→ RecallNumber). Letters/digits/hyphen only (^[A-Za-z0-9-]+$).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations indicate readOnlyHint and openWorldHint. Description adds extensive behavioral context: returns complete matching set, no fabricated totals, default date window, honest empty, data flattening, validation (date, recallNumber), and fixed host. No contradiction with annotations.

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 thorough, covering purpose, parameters, return structure, error cases, and data handling. While lengthy, it is well-organized with sections (KEYLESS, HONESTY) and formatting (★). Every sentence adds necessary detail; no redundancy.

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?

Given 5 optional parameters, 100% schema coverage, no output schema, the description fully explains return structure, default behavior, error modes, and data processing. It is comprehensive and leaves no significant gaps for an agent to infer.

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

Parameters4/5

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

Schema description coverage is 100% (all 5 parameters documented). The description adds value by explaining CPSC field mapping (e.g., RecallDateStart), substring matching, and validation patterns beyond the schema. It goes beyond bare schema documentation.

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 it looks up CPSC consumer-product recalls, listing specific data fields (title, hazard, remedy, etc.) and sources. It distinguishes itself from sibling tools like nhtsa_recalls (vehicles) and openfda (medical), establishing its unique domain.

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

Usage Guidelines5/5

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

Provides explicit when-to-use: consumer product recalls. Highlights keyless access, optional inputs, default 90-day window without filters, honest empty results, and error handling (invalid_input, schema_drift). Clearly distinguishes from alternatives.

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

cve_lookupA
Read-only

Look up NIST NVD CVE records (keyless; services.nvd.nist.gov CVE API 2.0) — exact by cveId (CVE-YYYY-NNNN) OR search by keyword/cpeName/cvssV3Severity/a publication or last-modified date range — each row JOINED with its CISA KEV (Known Exploited Vulnerabilities) status. THE B2G unlock for FedRAMP/CMMC/SBOM IT-compliance: CVSS severity AND whether CISA mandates remediation by a date, in one row. Returns { results:[{ cveId, vulnStatus, rejected, published, lastModified, description, cvssMetrics:[{version,source,type,baseScore,baseSeverity,vectorString,exploitabilityScore,impactScore}], primaryCvss:{version,baseScore,baseSeverity,type}|null, cwes, references, kev }] } + honest _meta. Optional kevOnly (KEV-listed rows only), resultsPerPage (≤2000, def 50), startIndex. CVSS HONESTY: every metrics key matching ^cvssMetric (V2/V30/V31/V40) is surfaced as its own cvssMetrics[] element — versions are NEVER conflated and ssvcV203/non-CVSS keys are excluded; V2 baseSeverity reads from the metric level; primaryCvss is the highest-version metric, preferring type:'Primary' but FALLING BACK to the highest Secondary (a real CNA score is never dropped), null ONLY when no CVSS exists (Rejected/Awaiting) — base scores are null-never-0. KEV HONESTY: kev is {listed:true,dateAdded,dueDate,ransomware,requiredAction,catalogVersion} | {listed:false,note} | {listed:null,status:'unavailable'}; a not-listed result carries the not-in-KEV≠safe caveat (absence is NOT a clearance); if the KEV catalog cannot load, kev.listed degrades to NULL (never false) with fieldsUnavailable:['kev'], and a kevOnly filter during that outage THROWS (a KEV-membership filter is unanswerable without the catalog). PAGINATION is from NVD's EXACT totalResults, never page length. A genuine totalResults:0 is an honest found:false; a 403/429 rate breach THROWS rate_limited with the NVD_API_KEY tier disclosure; 404/5xx/timeout/off-host-redirect THROW (never a fake-empty). An OPTIONAL free NVD_API_KEY (env; https://nvd.nist.gov/developers/request-an-api-key) lifts the rate and is sent ONLY in the apiKey header — never a URL/label/_meta/log.

ParametersJSON Schema
NameRequiredDescriptionDefault
cveIdNoExact CVE identifier CVE-YYYY-NNNN (^CVE-\d{4}-\d+$, validated client-side). Exact-lookup mode; a malformed cveId is rejected (invalid_input) — a malformed cveId 404s upstream. At least one of cveId/keyword/cpeName/cvssV3Severity/a date range is REQUIRED.
cpeNameNoA CPE 2.3 formatted string to match affected products (cpe:2.3:[aho]:… — e.g. cpe:2.3:a:apache:log4j:2.14.1:*:*:*:*:*:*:*). Non-CPE input is rejected (invalid_input).
kevOnlyNoWhen true, return ONLY rows listed in the CISA KEV catalog. ★If the KEV catalog cannot be loaded, this THROWS (a KEV-membership filter is unanswerable without a loaded catalog) — it NEVER returns a silently-empty set (which would falsely read as 'none on the mandatory-remediation list').
keywordNoFree-text keyword search (NVD keywordSearch) over CVE descriptions (e.g. 'log4j', 'apache struts'). Control chars stripped, length-capped; rides only as a query param (SSRF-safe).
pubEndDateNoPublication-date window END (ISO YYYY-MM-DD). Paired with pubStartDate.
startIndexNoZero-based page offset (default 0). Pagination derives from NVD's exact totalResults, never the page length.
pubStartDateNoPublication-date window START (ISO YYYY-MM-DD). PAIRED with pubEndDate (both required together — NVD 404s a lone bound). A span >120 days is clamped forward to 120 days BEFORE the request and disclosed.
cvssV3SeverityNoFilter to a CVSS v3 base severity band (LOW|MEDIUM|HIGH|CRITICAL).
lastModEndDateNoLast-modified window END (ISO YYYY-MM-DD). Paired with lastModStartDate.
resultsPerPageNoRows per page (default 50, max 2000 — NVD's cap). Over-cap is refused, never silently clamped.
lastModStartDateNoLast-modified window START (ISO YYYY-MM-DD). PAIRED with lastModEndDate (both required together). A span >120 days is clamped + disclosed.

TDQS

A4.5/5.0
Behavior5/5

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

The description provides extensive behavioral details: CVSS metrics handling, KEV honesty with caveats, pagination from NVD's exact totalResults, error handling for rate limits and HTTP errors, and API key usage. Annotations give readOnlyHint and openWorldHint, and the description adds significant context without contradiction.

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 long (multiple paragraphs) and covers many details. It is front-loaded with the main purpose, but the verbosity impacts conciseness. For a complex tool, it is acceptable, but could be more concise.

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?

The description is extremely complete: it explains input parameters, output structure (including nested objects), error states, rate limiting, and honesty policies. No output schema is provided, but the description compensates fully. It covers all necessary aspects for an agent to use the tool correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description adds extra context beyond schema: validation details (cveId format, date pairing, max pages), edge cases (kevOnly throwing on KEV catalog failure, over-cap refused, date span clamping), and honesty policies. This adds meaningful value.

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 explicitly states the tool does CVE lookup via cveId or search parameters, with KEV join. It is specific about the resource (NIST NVD CVE records) and the verb (look up/search). The sibling tools are in completely different domains (USAS, SAM, etc.), so this tool is clearly distinguished.

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 mentions the tool is for FedRAMP/CMMC/SBOM IT-compliance and includes CVSS severity and CISA KEV status. It does not explicitly say when NOT to use it or list alternatives, but given the sibling tools are unrelated, the usage context is clear.

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

datagov_search_datasetsA
Read-only

Search the data.gov DATASET CATALOG for federal open datasets across all publishing agencies (api.gsa.gov v4 Catalog API, keyed — DATA_GOV_API_KEY or the shared DEMO_KEY) — the replacement for the CKAN package_search endpoint data.gov RETIRED in 2025, restoring federal dataset DISCOVERY. Input query (→_q free-text), organization (publisher slug, e.g. 'epa-gov'), limit (1..100, def 20 → _size), cursor (the OPAQUE continuation → after). Returns { datasets:[{ id (slug), title, organization, description, accessLevel, license, landingPage, modified, lastHarvested, keywords, themes, distributions:[{ title, format }], identifier }] } + honest _meta. HONESTY: the v4 API reports NO total match count ⇒ totalAvailable is NULL (NEVER results.length, NEVER a fabricated total — a note discloses it); pagination is an OPAQUE cursor (offset/nextOffset null; nextCursor = the after token passed back verbatim as cursor; nextCursor:null / hasMore:false = last page). accessLevel is surfaced VERBATIM (public / restricted public / non-public) — the openness signal, null-when-absent (this tool DISCOVERS datasets; it does not ingest distributions). A genuine no-match (results:[], no cursor) ⇒ complete:true/returned:0; a 429 (DEMO_KEY ~10 req/hr, hit quickly) ⇒ rate_limited THROWS; a 5xx/timeout ⇒ upstream_unavailable THROWS; a 200 non-JSON / a non-array results ⇒ schema_drift (never a fake empty). DEMO_KEY ~10 req/hr shared ceiling — set DATA_GOV_API_KEY (free at api.data.gov/signup) for 1000/hr. The key rides ONLY in the X-Api-Key header (never the URL/_meta).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDatasets per page (→ _size), 1..100, default 20.
queryNoFree-text search over the dataset catalog (→ q), e.g. 'wildfire'. LIVE-CONFIRMED to narrow (2026-07-16: the v4 API param is `q`; the old `_q` is silently ignored).
cursorNoOpaque continuation cursor (→ after) — pass back the _meta.nextCursor from the previous page. Pagination is a cursor, NOT a numeric offset (offset/nextOffset are null); nextCursor:null means the last page. A bad token (spaces/'../'/'%') ⇒ invalid_input pre-fetch.
organizationNoPublisher organization SLUG filter (→ organization), e.g. 'epa-gov', 'noaa-gov'. An org catalog lists that agency's published datasets.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses that totalAvailable is always NULL, pagination is opaque cursor, error cases (429, 5xx, non-JSON) throw specific errors, and the API key is sent only in headers. This provides deep behavioral 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?

The description is long but well-structured with clear sections (e.g., HONESTY, error conditions). It is front-loaded with the main purpose. While verbose, the length is justified by the complexity and transparency needs.

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?

Given the tool has no output schema, the description thoroughly documents return values, error behaviors, pagination details, and authentication. It covers all necessary context for an agent to use the tool correctly without additional information.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds valuable context: for 'query' it confirms the mapping to 'q' and notes that '_q' is ignored; for 'cursor' it explains opaque token usage; for 'organization' it describes slug filtering. This exceeds what the schema alone provides.

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

Purpose5/5

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

The description clearly states the tool searches the data.gov DATASET CATALOG for federal open datasets. It specifies the verb 'search', the resource 'data.gov', and distinguishes it from sibling tools like ckan_discover_datasets by noting it is the replacement for the retired CKAN endpoint.

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 explains when to use this tool (as the successor to the retired CKAN endpoint) and provides context on API key limits (DEMO_KEY vs. dedicated key). It does not explicitly list exclusions, but the context is clear.

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

dol_get_datasetA
Read-only

Fetch records from ONE US DOL dataset (apiprod.dol.gov /v4/get/{agency}/{endpoint}/json). ★REQUIRES a free DOL_API_KEY: the DOL DATA endpoint has NO keyless tier, so without the key this tool THROWS an honest config error (get one at https://dataportal.dol.gov/registration; the dataset CATALOG — dol_list_datasets — and agency list stay keyless). Input: agency (required — the agencyAbbr from dol_list_datasets, e.g. 'WHD', 'OSHA', 'ILAB'; rides the PATH, ^[A-Za-z0-9_]+$), table (required — the dataset's apiUrl endpoint from dol_list_datasets, e.g. 'Child_Labor_Report__2016_to_2022'; rides the PATH, ^[A-Za-z0-9_]+$), optional limit (default 10, max 100), offset, filterField+filterValue (a paired equality filter → a DOL filter_object), fields (best-effort column selection). Returns { records:[…verbatim dataset rows…] } + honest _meta. HONESTY: records are surfaced VERBATIM (the data-record envelope is key-gated and unverified, so field names/values are preserved as-is — a genuine 0 stays 0, a missing field stays null; the tool never coerces or fabricates). totalAvailable is a real count field ONLY when the response carries one, else null (an honest unknown — returned is NEVER passed off as the total); offset pagination (a full page ⇒ hasMore, page forward to confirm). A missing/invalid key (401/403) ⇒ invalid_input carrying the DOL_API_KEY guidance (never empty); a 400 ⇒ invalid_input; a genuine empty ⇒ honest empty (returned:0); a 429 ⇒ rate_limited THROWS (Retry-After honored); a 5xx/timeout ⇒ upstream_unavailable THROWS; a 200 non-JSON / no row array ⇒ schema_drift. The key rides ONLY in the X-API-KEY request header — never the URL / _meta / a log.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax records to return (default 10, max 100). Offset-paginated.
tableYesThe dataset endpoint — the `apiUrl` field from dol_list_datasets (the DOL 'api_url', NOT the tablename), e.g. 'Child_Labor_Report__2016_to_2022'. Rides in the request PATH. Validated ^[A-Za-z0-9_]+$. Required.
agencyYesThe agency abbreviation (the `agencyAbbr` from dol_list_datasets), e.g. 'WHD', 'OSHA', 'ILAB'. Rides in the request PATH. Validated ^[A-Za-z0-9_]+$. Required.
fieldsNoOptional: best-effort column selection (a subset of field names to return). Not documented for v4; the API ignores or 400s an unsupported selection (surfaced honestly).
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
filterFieldNoOptional: a dataset field name to filter on (paired with filterValue → a DOL filter_object equality filter). Supply BOTH or NEITHER.
filterValueNoOptional: the value the filterField must equal. Supply BOTH filterField and filterValue, or NEITHER.

TDQS

A4.9/5.0
Behavior5/5

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

The description provides extensive behavioral details beyond annotations: key requirement, error handling for various status codes (401/403, 400, empty, 429, 5xx, 200 non-JSON), pagination (offset, hasMore, nextOffset), honesty about totalAvailable, and verbatim data return. Annotations only provide readOnlyHint and openWorldHint.

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 lengthy but every sentence adds value. It uses bold for emphasis and organizes information logically (purpose, key requirement, parameters, error handling). Could be slightly more concise but justified given complexity.

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?

Despite no output schema, the description explains return format, pagination, error responses, and dependency on dol_list_datasets. Complete for a data-fetching tool.

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

Parameters5/5

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

Schema coverage is 100%, and the description adds meaningful context: required fields from dol_list_datasets, regex validation, paired filterField/filterValue as equality filter, default and max for limit, best-effort column selection for fields.

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 'Fetch records from ONE US DOL dataset', specifying the verb and resource. It distinguishes from sibling tools by noting the dependency on dol_list_datasets for discovering datasets and agencies.

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

Usage Guidelines5/5

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

Explicitly says when to use: to fetch records from a DOL dataset. Details prerequisites (requires DOL_API_KEY) and that without the key it throws an error. Also notes that dol_list_datasets and agency list stay keyless, providing guidance on alternatives.

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

dol_list_datasetsA
Read-only

List the US Department of Labor Data API v4 dataset catalog (apiprod.dol.gov /v4/datasets) — the machine inventory of DOL enforcement/statistics datasets (WHD wage & hour, OSHA inspections, ILAB child/forced-labor reports, MSHA mine safety, ETA …). KEYLESS: the catalog needs NO API key (only dol_get_dataset does). Input (all optional): agency (CLIENT-SIDE filter by agency abbreviation like 'WHD'/'OSHA'/'ILAB', or an agency-name substring), query (CLIENT-SIDE free-text substring over dataset name/description/category/table/endpoint), limit (default 25, max 200), offset. Returns { datasets:[{ name, tablename, apiUrl, agency, agencyAbbr, description, frequency, datasetType, category }] } + honest _meta. ★Feed a row's apiUrl (the DOL 'api_url' endpoint) + its agencyAbbr into dol_get_dataset to fetch that dataset's records. HONESTY: agency/query filtering is CLIENT-SIDE (the DOL catalog API does not filter server-side, verified live); totalAvailable is the catalog's REAL total (meta.total_count) for an unfiltered scan, or the exact filtered-set size (the whole catalog is fetched in one page); offset pagination. Every scalar is null-never-empty-string. A non-array datasets / 200 non-JSON ⇒ schema_drift; a 5xx ⇒ THROWS.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDatasets to return per page (default 25, max 200). Offset-paginated over the (filtered) catalog.
queryNoCLIENT-SIDE free-text filter (substring over dataset name / description / category / table / endpoint), e.g. 'child labor', 'wage', 'inspection'.
agencyNoCLIENT-SIDE filter by agency abbreviation (e.g. 'WHD', 'OSHA', 'ILAB', 'ETA') or a substring of the agency name. The DOL catalog API does not filter server-side, so this is applied to the fetched catalog.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses client-side filtering, throws on 5xx, handles schema drift, explains pagination and totalAvailable behavior. Adds value beyond readOnlyHint and openWorldHint annotations with honest verification.

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?

Well-organized with core purpose first, then details, return format, and error handling. Slightly verbose but every sentence provides unique value; minor redundancy possible.

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?

Covers all essential aspects: input, filtering behavior, return structure, pagination, error modes, and connection to sibling tool. No output schema, but return format is documented inline.

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

Parameters5/5

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

Enriches every parameter beyond schema descriptions: default/max for limit, examples for query, client-side nature for agency, pagination hint for offset. Coverage is 100% and description adds concrete, actionable detail.

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

Purpose5/5

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

Clearly states it lists the DOL Data API v4 dataset catalog, identifies it as the machine inventory of enforcement/statistics datasets, and distinguishes itself from dol_get_dataset by noting keyless access.

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

Usage Guidelines4/5

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

Explicitly describes when to use (catalog listing) and how to connect results to dol_get_dataset. Implicitly excludes other tools through sibling context, but lacks explicit 'when not to use' statements.

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

ecfr_get_sectionA
Read-only

Get the FULL in-force text of ONE CFR section by citation (the companion to ecfr_search, which returns only snippets). Input titleNumber (1–50) + section (e.g. '200.1' → 2 CFR 200.1, uniform grants guidance; '1601.1' → 29 CFR labor) + optional issue date (default = the title's latest). Returns { citation, alternateReference, heading, fullText, issueDate, ecfrUrl }. ★For a FAR/DFARS clause (title 48) prefer far_clause_lookup — it adds the prescription, revision, and FAR-overhaul-risk this generic tool does not; use ecfr_get_section for the OTHER 49 titles (grants/labor/IRS/SBA/…). HONESTY: text is the eCFR's own, de-XMLed (no fabrication); a nonexistent section ⇒ not_found (never a fake/wrong section); the resolved issue date is disclosed (the title's latest is a moving target); a bad section format ⇒ invalid_input (SSRF charclass); an outage ⇒ throws. Keyless.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoOptional eCFR issue date YYYY-MM-DD; omit to use the title's LATEST issue (disclosed in _meta).
sectionYesThe section citation, e.g. '200.1' (2 CFR 200.1) or '52.204-21' — the part number is the pre-dot integer. Charclass-validated (^[0-9]{1,3}\.[0-9]{1,4}(-[0-9]{1,4})?$).
titleNumberYesCFR title (1–50). e.g. 2 = federal financial assistance (grants), 29 = Labor, 26 = IRS. For FAR/DFARS (title 48) prefer far_clause_lookup.

TDQS

A4.9/5.0
Behavior5/5

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

Discloses data source authenticity (de-XMLed, no fabrication), error modes (not_found, invalid_input, throws on outage), and issue date disclosure. Annotations already provide readOnly and openWorld hints, but description adds valuable behavioral context.

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?

Description is front-loaded with core purpose but contains multiple examples and error conditions. A bit lengthy but every sentence adds value. Slightly above average conciseness.

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

Completeness5/5

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

No output schema, but description explicitly states return fields (citation, alternateReference, heading, fullText, issueDate, ecfrUrl). Covers error cases. Complete for a single-section retrieval tool.

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

Parameters5/5

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

Schema has 100% description coverage, and description adds examples (e.g., '200.1' for grants, '52.204-21' for FAR), context for titleNumber (2=grants, 29=Labor), and date format validation. Adds meaning beyond schema.

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

Purpose5/5

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

The description uses specific verb 'Get' and resource 'FULL in-force text of ONE CFR section by citation.' It distinguishes itself from siblings ecfr_search (snippets) and far_clause_lookup (title 48).

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

Usage Guidelines5/5

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

Explicitly states when to use (other 49 titles) and when not (FAR/DFARS prefer far_clause_lookup). Also explains optional date parameter default behavior.

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

ecfr_list_titlesA
Read-only

List all 50 CFR titles with name + last_amended_on date. Use to discover what's in each title (Title 48 = FAR, Title 32 = National Defense, Title 14 = Aeronautics, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, which cover the safety profile. The description adds that the tool returns names and last_amended_on dates, providing modest context beyond the annotations, but no additional behavioral traits like 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.

Conciseness5/5

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

Two sentences that front-load the purpose and efficiently convey the value. Every word earns its place, with no redundancy.

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?

Despite having no output schema, the description explicitly states the return fields (name and last_amended_on). For a simple list-all tool, this is sufficient context. The tool's behavior is straightforward and the description covers the essentials.

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?

The tool has zero parameters with 100% schema coverage. Baseline for no parameters is 4, and the description does not need to add parameter details. It correctly omits any parameter explanations.

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

Purpose5/5

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

The description uses a specific verb ('List'), resource ('all 50 CFR titles'), and includes the data fields returned (name + last_amended_on date). It clearly distinguishes from sibling tools like ecfr_search and ecfr_get_section by focusing on listing titles rather than searching within them.

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 explicitly says 'Use to discover what's in each title' and provides examples, indicating the tool is for initial exploration. It does not explicitly state when not to use it, but the context excludes the need for deeper search, which is handled by siblings.

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

echo_facility_reportA
Read-only

Fetch the EPA ECHO Detailed Facility Report (DFR) for ONE facility by its FRS RegistryID (keyless) — the per-facility compliance / enforcement / inspection / permit deep-dive for competitor or acquisition-target due diligence. Input registryId (all-digit FRS id, 9–12 digits, from echo_search_facilities rows). Returns { registryId, report:{…verbatim compliance/enforcement/permit detail…} } + single-record _meta (complete:true, no pagination). A bad/unknown RegistryID ⇒ not_found (never a fabricated report).

ParametersJSON Schema
NameRequiredDescriptionDefault
registryIdYesThe facility's FRS RegistryID (from echo_search_facilities rows' RegistryID) — an all-digit id, 9–12 digits (e.g. '110059768461'). A bad/unknown id ⇒ not_found (never a fabricated report).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description adds valuable context: 'never a fabricated report', output structure including _meta, and error behavior on bad RegistryID. No contradictions.

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?

Three sentences, each with a clear role: purpose, input, output/behavior. No unnecessary words, front-loaded with the most critical information.

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 single-parameter read-only tool, the description covers purpose, input, output format, error behavior, and usage scenario. No missing elements given the simplicity.

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

Parameters4/5

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

Schema coverage is 100% with a detailed description of registryId. The tool description adds context about source (echo_search_facilities rows), validation (all-digit, 9–12 digits), and error behavior, going beyond the schema.

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

Purpose5/5

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

The description explicitly states 'Fetch the EPA ECHO Detailed Facility Report (DFR) for ONE facility by its FRS RegistryID', providing a specific verb, resource, and scope. It distinguishes from the sibling tool echo_search_facilities which is for searching facilities. No ambiguity.

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

Usage Guidelines4/5

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

The description explains when to use: 'for competitor or acquisition-target due diligence', and clarifies input source: 'from echo_search_facilities rows'. It also describes behavior on bad input but does not explicitly state when not to use, though the unique purpose makes it clear.

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

echo_search_facilitiesA
Read-only

Search EPA-regulated facilities by US state (+ optional sic / facilityName / majorOnly / federalOnly) with compliance/enforcement screening fields (EPA ECHO, keyless) — the NEW facility environmental compliance-risk / due-diligence axis (CAA/CWA/RCRA/SDWA violation, inspection, penalty, SNC history). Input state (REQUIRED enum — the SSRF + silent-zero guard), sic (2–4 digits, a REAL filter), naics (2–6 digits, BEST-EFFORT — ECHO DROPS it upstream, reported in _meta.filtersDropped + a note), facilityName (substring; a typo silently returns 0), majorOnly/federalOnly (bool), limit (≤1000, def 100), offset (multiple of limit). Returns { state, facilities:[…verbatim rows incl. RegistryID…], summary:{ queryRows, programCounts, totalPenalties } } + honest _meta. HONESTY: totalAvailable = the EXACT QueryRows total (NEVER the page size); a hidden two-step QueryID pagination fetches the rows (the QueryID is ephemeral/globally-recycled, never exposed); genuine-empty ⇒ complete:true/total:0; a queryset-limit overflow / bad query ⇒ invalid_input; an outage/5xx ⇒ THROWS (never a fake empty). Feed a row's RegistryID to echo_facility_report.

ParametersJSON Schema
NameRequiredDescriptionDefault
sicNoIndustry filter (2–4 digit SIC code). A REAL filter — ECHO narrows by SIC (live-verified). A code with no facilities returns 0 (silent-zero — verify the code).
limitNoFacilities per page (→ responseset), 1..1000, default 100.
naicsNoBEST-EFFORT industry filter (2–6 digit NAICS). WARNING: ECHO DROPS the NAICS filter upstream (live-verified 2026-07-12) — the returned facilities are NOT guaranteed to match this code; it is reported in _meta.filtersDropped + a note. Use `sic` (which DOES narrow) to scope by industry.
stateYesUS state / territory 2-letter code to scope the search (REQUIRED — an unscoped national query is ~5.6M rows; the enum is also the SSRF value guard + the silent-zero guard). e.g. 'DC', 'TX', 'CA', 'PR'.
offsetNo0-based offset for pagination, default 0. MUST be an exact multiple of `limit` (ECHO pages on fixed boundaries; a non-multiple ⇒ invalid_input).
majorOnlyNotrue ⇒ only EPA 'major' facilities (p_maj=Y).
federalOnlyNotrue ⇒ only federal facilities (p_ff=Y).
facilityNameNoFacility-name substring filter (p_fn). NOTE: not validated by ECHO — a typo silently returns 0 results, not an error.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description discloses many behavioral traits: two-step pagination with ephemeral QueryID, honest totalAvailable (not page size), error handling (invalid inputs throw, outages throw, never fake empty), and the fact that naics filter is dropped upstream. No contradictions.

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 quite long but densely packed with useful information. It is front-loaded with the main purpose. Could be slightly more structured (e.g., bullet points for parameters) but remains clear and efficient given the complexity.

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?

Given the tool's complexity (8 params, one required, special pagination, error modes, relationship to another tool), the description is remarkably complete. It covers return structure (state, facilities, summary, _meta), honesty guarantees, and all edge cases. No output schema, but description compensates by outlining the response fields.

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

Parameters5/5

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

Schema coverage is 100%, but description adds significant context: state enum is also SSRF/silent-zero guard; offset must be multiple of limit; facilityName typo silent zero; naics is best-effort and dropped; majorOnly/federalOnly are straightforward. Description enriches understanding far beyond schema alone.

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 function: searching EPA-regulated facilities by US state with compliance/enforcement fields. It specifies the main resource (facilities) and action (search), and distinguishes it from sibling echo_facility_report by mentioning that tool as a follow-up.

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

Usage Guidelines5/5

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

Provides explicit guidance: state is required and also serves as SSRF guard; sic is a real filter while naics is best-effort and may be dropped; facilityName typos silently return 0; pagination details (limit/offset multiples, max 1000); and mentions feeding results to echo_facility_report for more detail.

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

edgar_company_conceptA
Read-only

One filer × one XBRL concept × the COMPLETE reported time-series (keyless, from data.sec.gov companyconcept). The focused financial-TREND / entity-vetting primitive BETWEEN edgar_company_facts (many curated concepts for one filer) and edgar_xbrl_frames (one concept across ALL filers for one period) — 'track THIS filer's Assets/Revenues/NetIncomeLoss OVER TIME, and was it ever revised?'. Input cikOrTicker (CIK or resolvable ticker/name), concept (EXACT alnum XBRL tag, e.g. 'Assets'), optional taxonomy (us-gaap|dei|ifrs-full, def us-gaap), unit (CLIENT-SIDE key filter), form/fy (client-side), canonicalOnly (def false), limit/offset. Returns { found, cik, entityName, taxonomy, concept, label, description, unitsAvailable:[{unit,count}], rows:[{ unit, start, end, val, accn, fy, fp, form, filed, frame, canonical }] }. HONESTY: (M1) period identity is the (start,end) PAIR — every row carries start (null for INSTANT concepts, the ISO date for DURATION/flow concepts); the SAME end with a DIFFERENT start is a different-duration fact (a 3-month quarter vs the 12-month year), NOT a revision — a revision is only multiple rows sharing the same (start,end) with a differing accn/filed/val. DEFAULT returns ALL rows incl. the amendment/restatement history + a per-row canonical (frame-tagged = SEC's consolidated value); canonicalOnly:true dedups to one canonical row per (unit,start,end), fully disclosed, never a silent drop. Every row is unit-tagged (a USD amount is NEVER conflated with a share count); unitsAvailable discloses ALL units with their RAW counts even under a unit filter; val is null-never-0. A bad CIK/taxonomy/concept ⇒ upstream 404 ⇒ found:false (NEVER a fabricated val:0); a 5xx/timeout/non-JSON/units-shape-drift THROWS; a unit not present ⇒ honest empty + the available-units note (unit is CLIENT-SIDE, not a path segment). cik/taxonomy/concept are validated path segments (regex+enum, re-checked pre-fetch) — no injection surface. NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS — there is no authoritative CIK↔UEI join.

ParametersJSON Schema
NameRequiredDescriptionDefault
fyNoOptional CLIENT-SIDE filter: keep only rows whose fiscal year `fy` equals this integer (e.g. 2023).
formNoOptional CLIENT-SIDE filter: case-insensitive EXACT match on a row's `form` (e.g. '10-K' for annual values only, '10-Q' for quarterly).
unitNoOptional CLIENT-SIDE filter on the returned units{} keys (NOT a path segment — 'USD', 'shares', 'USD/shares', 'EUR', 'pure'). Restricts rows to that unit but STILL discloses the other units via unitsAvailable + a note. A unit not present ⇒ 0 rows + the available-units note (never a fabricated pick).
limitNoCLIENT-SIDE page size over the already-fully-fetched, (unit,start,end)-keyed time-series (1..1000, default 100). Does NOT reduce the upstream fetch (SEC does not paginate companyconcept); page via _meta.pagination.nextOffset.
offsetNo0-based client-side offset into the filtered time-series (default 0).
conceptYesXBRL concept tag — EXACT, alphanumeric CamelCase (e.g. 'Assets', 'Revenues', 'NetIncomeLoss', 'Liabilities'). A tag the filer never reported ⇒ upstream 404 ⇒ found:false (never a fabricated 0).
taxonomyNoXBRL taxonomy namespace (a fixed enum — the SSRF guard for this segment): 'us-gaap' (financial statements, default), 'dei' (entity/document info, e.g. EntityCommonStockSharesOutstanding), or 'ifrs-full' (IFRS filers, e.g. a foreign private issuer). Live-confirmed members only.
cikOrTickerYesA 10-digit (or unpadded) SEC CIK, or a ticker/company-name resolvable via company_tickers.json (e.g. '320193', 'CIK0000320193', 'AAPL').
canonicalOnlyNoWhen true, reduce to ONE row per distinct (unit,start,end) period — the frame-tagged canonical value, or (for a not-yet-consolidated period) the latest-filed row (marked canonical:false). SUPERSEDED/amendment rows are REMOVED (fully disclosed via a note). Default false ⇒ ALL rows incl. the amendment/restatement history. A same-`end` different-`start` pair is a DIFFERENT period (both kept), NOT a duplicate.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint and openWorldHint. The description goes far beyond by detailing period identity, revision detection, null vs. 0 handling, error behaviors (404 vs. 5xx vs. throw), validation, injection prevention, and the 'canonicalOnly' dedup logic. No contradictions with annotations.

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 comprehensive but verbose. It is front-loaded with purpose and relationship, then dives into extensive 'HONESTY' details. While every sentence adds value, the length could be slightly reduced for quicker parsing. However, given complexity, the structure is logical.

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?

The description covers the full return structure, error handling, client-side filtering, period identity, and revision semantics. It addresses edge cases and provides sufficient detail for an agent to invoke the tool correctly, even without an output schema. All 9 parameters are well-documented in context.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial context: explains how each parameter interacts with the upstream API (e.g., 'unit' as client-side filter, 'canonicalOnly' deduplication), clarifies edge cases (unit not present yields empty result with note), and enriches understanding of parameters like 'fy' and 'form' as client-side filters.

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 identifies the tool as fetching a complete time-series for one filer and one XBRL concept. It explicitly distinguishes itself from siblings `edgar_company_facts` and `edgar_xbrl_frames` by positioning as a focused primitive for tracking trends and revisions.

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

Usage Guidelines5/5

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

The description provides explicit usage context: 'track THIS filer's Assets/Revenues/NetIncomeLoss OVER TIME, and was it ever revised?' It also clarifies the middle position between its two sibling tools, implying when to use this vs. the others. It includes detailed behavioral notes that serve as guidelines for interpreting results.

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

edgar_company_factsA
Read-only

Curated XBRL financial facts for a filer (keyless, from data.sec.gov companyfacts). Input cikOrTicker, optional concepts (default: 6 curated USD concepts — Revenues/RevenueFromContractWithCustomerExcludingAssessedTax, Assets, Liabilities, StockholdersEquity, NetIncomeLoss, CashAndCashEquivalentsAtCarryingValue), unit (default USD), latest. A concept absent for the filer is OMITTED (never 0); a concept present only in another unit (e.g. EPS in USD/shares) is reported under wrongUnit with a note.

ParametersJSON Schema
NameRequiredDescriptionDefault
unitNoXBRL unit to extract, default 'USD'. A concept present only in another unit (e.g. EarningsPerShareBasic in 'USD/shares') is reported under wrongUnit with a note — never a silent 0.
latestNotrue ⇒ reduce each concept to its single most-recent data point (by period end). false (default) ⇒ the full reported time series.
conceptsNoOptional XBRL us-gaap/dei concept tags to extract (e.g. ['Assets','NetIncomeLoss']). Default: the 6 curated USD concepts (Revenues/RevenueFromContractWithCustomerExcludingAssessedTax, Assets, Liabilities, StockholdersEquity, NetIncomeLoss, CashAndCashEquivalentsAtCarryingValue). A concept absent for the filer is OMITTED (never 0).
cikOrTickerYesA 10-digit (or unpadded) SEC CIK, or a ticker/company-name resolvable via company_tickers.json (e.g. '320193', 'AAPL').

TDQS

A4.4/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description adds critical behavioral details: missing concepts are omitted (never 0), and concepts available only in non-default units are reported under wrongUnit with a note. Also notes keyless access.

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 sentences, front-loaded with purpose and key parameters, then edge-case behaviors. No redundant information, making it highly efficient.

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

Completeness4/5

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

Covers inputs, defaults, and edge cases well. Missing explicit description of output structure (though openWorldHint implies flexible response). With no output schema, a brief note on return format would improve completeness.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds value by listing the default 6 curated concepts and explaining edge cases for unit mismatches and absent concepts, which are not in the schema. This goes beyond the schema 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 it provides curated XBRL financial facts for a filer, specifying the data source (data.sec.gov companyfacts) and key parameters. It distinguishes from sibling tools like edgar_company_concept (single concept) and edgar_xbrl_frames (aggregated frames) by focusing on multiple concepts with defaults.

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 for retrieving multiple financial facts with optional customization, but does not explicitly compare to sibling tools like edgar_company_concept or edgar_company_filings. No guidance on when not to use it or prerequisites, leaving the agent to infer use cases.

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

edgar_company_filingsA
Read-only

A company's SEC filings (keyless, from data.sec.gov submissions). Input cikOrTicker (CIK or resolvable ticker/name), optional forms (e.g. ['10-K','8-K']), limit (≤100, default 20), offset, fullHistory (default false), maxShards (1..100, default 10). Returns filings with the REAL primary-document archive URL. By default returns the recent window (up to 1 year OR 1000 filings, whichever is more); set fullHistory:true to ALSO fetch the older filings.files[] shards (newest-first up to maxShards) and assemble the COMPLETE history (recent ++ shard001..N, descending, no re-sort). HONESTY: totalAvailable = recent + Σ ALL older-shard counts (the grand total, incl un-fetched shards — never recomputed down), so a capped/failed fan-out reads complete:false; a note discloses COMPLETE vs PARTIAL-BY-CAP (RAISE maxShards for older un-fetched shards — pagination does NOT reach them) vs PARTIAL-BY-FAILURE (a 404/bad-CIK/transient shard is skipped, missing filings disclosed, never fabricated); fullHistory serializes N shard GETs through the shared EDGAR throttle gate. NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
formsNoOptional form-type filter (e.g. ['10-K','10-Q','8-K']); case-insensitive exact match on the filing's form. Omit for all forms.
limitNoMax filings to return, 1..100, default 20 (offset pagination over the recent window).
offsetNo0-based offset into the (form-filtered) recent filings, default 0.
maxShardsNoFan-out cap when fullHistory is true: at most this many older shards are fetched (newest-first), 1..100, default 10. Bounds wall-time (each shard is one throttle-gated GET, serialized through the SHARED edgar gate) + payload. When totalShards > maxShards the response is PARTIAL-BY-CAP (hasMore:true; older un-fetched shards reached by RAISING maxShards, not by nextOffset). Ignored when fullHistory is false.
cikOrTickerYesA 10-digit (or unpadded) SEC CIK, or a ticker/company-name resolvable via company_tickers.json (e.g. '320193', 'CIK0000320193', 'AAPL').
fullHistoryNoWhen true, ALSO fetch the older filings.files[] submission shards (newest-first, up to maxShards) and assemble the COMPLETE filing history (recent ++ shard001..N, descending order preserved). Default false ⇒ recent window only (byte-identical to omitting it). A capped/failed fan-out is disclosed as PARTIAL — never a capped set claimed complete.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations (readOnlyHint, openWorldHint) by detailing the fullHistory mechanics, shard fetching, honesty in totalAvailable (recent + all shard counts), cap/failure disclosure (PARTIAL-BY-CAP, PARTIAL-BY-FAILURE), and the shared EDGAR throttle gate. No contradictions with annotations.

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 dense but efficient, with no wasted words. It front-loads the purpose and input summary, then adds behavioral notes. However, it could benefit from minor structuring (e.g., listing parameters) to improve scanability for an agent.

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?

Given the tool's complexity (6 parameters, shard logic, throttle gate, completeness guarantees) and no output schema, the description covers all essential aspects: input, behavior, edge cases (partial responses), and return format (filings with archive URL). It provides sufficient detail for correct invocation and interpretation.

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

Parameters5/5

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

All 6 parameters have schema descriptions, but the tool description adds substantial value: explains the default for limit (20), maxShards (10), fullHistory (false), clarifies that offset applies to recent window, and describes the interplay between fullHistory and maxShards. It also defines keyless access and the source URL.

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 it returns a company's SEC filings from data.sec.gov, specifying inputs (cikOrTicker, forms, limit, offset, fullHistory, maxShards) and output (filings with real primary-document URL). It distinguishes itself from siblings like edgar_company_facts or edgar_full_text_search by focusing on filings retrieval.

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

Usage Guidelines4/5

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

The description provides explicit guidance on when to use fullHistory (for complete history vs. recent window), how pagination works (offset vs. maxShards), and what to do if capped (raise maxShards). It also notes the EDGAR throttle gate and that CIK is used, not SAM UEI/DUNS. While it doesn't name alternative tools explicitly, the context is clear enough for an agent to decide.

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

edgar_daily_filing_indexA
Read-only

Per-DAY cross-filer SEC filing index (keyless, from the www.sec.gov EDGAR daily-index master.YYYYMMDD.idx). The per-day sibling of edgar_filing_index (~30× smaller): reads ONE calendar day's index (every filer's every filing that day — CIK|Company|Form|Date|File Name, ~8K rows), FULL-SCANS it, and returns offset-paginated filings matching CLIENT-SIDE filters with the EXACT total. Answers the monitoring/alerting question the quarterly tool cannot ('every 8-K filed on 2024-01-03', 'watch a CIK day-by-day'). Input date (required ISO YYYY-MM-DD, >=1994-01-01, not future); optional formType (exact form, e.g. '8-K'), cik (numeric, leading-zero-safe), companyContains (LITERAL case-insensitive substring), limit (<=1000, def 100), offset. Returns { found, date, year, quarter, indexFile, returned, totalAvailable, filings:[{ cik, cikPadded, companyName, formType, dateFiled, filename, filingUrl }] }. HONESTY: totalAvailable is the EXACT match count over the full day scan — never a page length, never a byte-capped subset (SEC ignores HTTP Range). The daily-index's pervasive-403 empty model is disambiguated via the quarter's index.json existence oracle, RECENCY-AWARE: a day NEWER than the newest published index (weekend/holiday/not-yet-disseminated recent trading day) ⇒ found:false, complete:FALSE, retryable not-yet-disseminated note (NEVER a confident empty); an unlisted day INSIDE the covered range (a real weekend/holiday) ⇒ found:false, complete:true genuine-absent; a LISTED day whose .idx 403s ⇒ honest rate_limited; the oracle itself inconclusive ⇒ ambiguous both-causes upstream_unavailable. A non-real/future date is rejected pre-fetch (invalid_input, 0 fetch); a non-index / all-malformed body is refused as schema_drift. dateFiled is normalized to ISO from the compact YYYYMMDD column. NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS — there is no authoritative CIK↔UEI join.

ParametersJSON Schema
NameRequiredDescriptionDefault
cikNoOptional CLIENT-SIDE filter: numeric SEC CIK (1-10 digits or a number), matched leading-zero-safe via padCik on both sides (so '320193' and '0000320193' match the same filer).
dateYesRequired calendar day ISO YYYY-MM-DD (>= 1994-01-01 — EDGAR daily-index begins 1994 Q1). The handler derives year/quarter/yyyymmdd. A malformed / non-real day (2024-02-30, non-leap 2023-02-29) or a FUTURE date is rejected as invalid_input with 0 fetch. TODAY is allowed (its index may not be posted until ~22:00 US-Eastern).
limitNoPage size over the FILTERED, full-scanned matches (1..1000, default 100). Does NOT reduce the download — the whole day is scanned; this only windows the returned rows (page via _meta.pagination.nextOffset).
offsetNo0-based offset into the filtered matches (default 0).
formTypeNoOptional CLIENT-SIDE filter: case-insensitive EXACT match on the Form Type column (e.g. '8-K', '10-K'). '8-K' does NOT match '8-K/A' — pass each amendment variant separately.
companyContainsNoOptional CLIENT-SIDE filter: case-insensitive LITERAL substring on the Company Name column. A multi-word value matches as ONE contiguous string (NOT AND/OR-tokenized).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description details important behavioral traits: full-scan behavior, honesty about totalAvailable (exact match count, not page-limited), handling of 403 errors with multiple fallback scenarios (not-yet-disseminated vs genuine absence vs rate-limited), date validation pre-fetch, and normalization of dateFiled. No contradictions with annotations.

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 well-structured with clear paragraphs and bullet-like lists (e.g., the HONESTY section and date handling). It is relatively verbose but every sentence provides useful context. It could be slightly more succinct, but it earns its length through valuable detail.

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?

Given the complexity (6 parameters, no output schema, integration with EDGAR's quirks), the description covers all essential aspects: data source, filtering, pagination behavior, error handling (403 scenarios), date validation, honesty about results, and normalization. It leaves no major gaps for an agent to misuse the tool.

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

Parameters4/5

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

All six parameters are described in the input schema with 100% coverage. The description adds value by explaining how filters are applied (CLIENT-SIDE), that limit does not reduce download size, and that date validation occurs pre-fetch. While the schema already provides adequate descriptions, the tool description enhances understanding of behavior beyond syntax.

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 it is a per-day cross-filer SEC filing index, distinguishing itself from the sibling tool 'edgar_filing_index' by specifying it is ~30× smaller and reads one calendar day's index. It uses specific verbs like 'reads', 'FULL-SCANS', and 'returns' to clearly define the action and result.

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

Usage Guidelines5/5

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

The description explicitly contrasts with the quarterly tool, stating it answers 'the monitoring/alerting question the quarterly tool cannot' and provides concrete examples like 'every 8-K filed on 2024-01-03' and 'watch a CIK day-by-day'. This gives clear guidance on when to use this tool versus alternatives.

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

edgar_filing_indexA
Read-only

Bulk cross-filer SEC filing index for a quarter (keyless, from the www.sec.gov EDGAR full-index master.idx). Reads the WHOLE quarter's index (every filer's every filing — CIK|Company|Form|Date|Filename, ~370K rows), FULL-SCANS it, and returns offset-paginated filings matching CLIENT-SIDE filters with the EXACT total. Input year (>=1993, <= current year), quarter (1..4); optional formType (exact form, e.g. '8-K'), cik (numeric, leading-zero-safe), companyContains (LITERAL case-insensitive substring), dateFrom/dateTo (ISO YYYY-MM-DD), limit (<=1000, def 100), offset. Returns { year, quarter, indexFile, returned, totalAvailable, filings:[{ cik, cikPadded, companyName, formType, dateFiled, filename, filingUrl }] }. This is the BULK-ENUMERATION primitive (the per-filer edgar tools need a CIK you already hold; this sweeps a whole quarter by form/date/company, e.g. 'every 8-K in 2024 Q1'). HONESTY: totalAvailable is the EXACT match count over the full quarter scan — never a page length, never a byte-capped subset (SEC ignores HTTP Range); a 0-match result is a genuine EXACT ZERO (complete:true), NOT a truncation; a bounds-valid but unpublished quarter returns HTTP 403 and is surfaced as an AMBIGUOUS both-causes error (quarter-not-published OR the 10 req/s rate-block), never a bare rate-limit and never a fake-empty; a non-index / all-malformed body is refused as schema_drift; a future year / bad quarter is rejected pre-fetch (invalid_input, 0 fetch). The CURRENT quarter grows daily (totalAvailable is exact AS-OF-snapshot). filingUrl is a resolvable archive URL. NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS — there is no authoritative CIK↔UEI join.

ParametersJSON Schema
NameRequiredDescriptionDefault
cikNoOptional CLIENT-SIDE filter: numeric SEC CIK (1-10 digits or a number), matched leading-zero-safe via padCik on both sides (so '320193' and '0000320193' match the same filer).
yearYesFiling year (>= 1993 — EDGAR full-index begins 1993 Q1). Must be <= the current year; a future year is rejected as invalid_input with 0 fetch. Path segment.
limitNoPage size over the FILTERED, full-scanned matches (1..1000, default 100). Does NOT reduce the download — the whole quarter is scanned; this only windows the returned rows (page via _meta.pagination.nextOffset).
dateToNoOptional CLIENT-SIDE filter: keep filings whose Date Filed <= this ISO YYYY-MM-DD.
offsetNo0-based offset into the filtered matches (default 0).
quarterYesCalendar quarter 1..4 (path segment QTR<quarter>). A same-year FUTURE quarter returns a well-formed EMPTY result (genuine-empty, complete:true), NOT an error.
dateFromNoOptional CLIENT-SIDE filter: keep filings whose Date Filed >= this ISO YYYY-MM-DD (string compare; the column is already YYYY-MM-DD).
formTypeNoOptional CLIENT-SIDE filter: case-insensitive EXACT match on the Form Type column (e.g. '8-K', '10-K'). '8-K' does NOT match '8-K/A' — pass each amendment variant separately.
companyContainsNoOptional CLIENT-SIDE filter: case-insensitive LITERAL substring on the Company Name column. A multi-word value matches as ONE contiguous string (NOT AND/OR-tokenized).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds extensive behavioral details: full scan of the quarter, exact match count, handling of edge cases (future year, unpublished quarter, schema drift), and honesty about zero-match results. No contradictions with annotations.

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 long but well-structured: purpose first, then details, then honesty notes, then error handling, then CIK vs. UEI distinction. Every sentence adds value, though some technical details (e.g., exact filename) could be trimmed slightly without loss of clarity.

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?

Given the tool's complexity (9 parameters, no output schema), the description is highly complete. It explains the return structure (filings array fields), pagination, error handling, and edge cases. It compensates for the missing output schema by listing return fields and filingUrl. Sibling context is well-addressed.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description adds extra nuance beyond the schema for several parameters: year range and future year rejection, quarter future handling, formType exact match with no substring, companyContains as literal contiguous substring. This improves semantic understanding.

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 reads the entire SEC EDGAR filing index for a quarter and returns paginated results. It explicitly distinguishes itself from sibling tools like edgar_company_filings by noting it is the 'BULK-ENUMERATION primitive' that does not require a CIK.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use this tool versus per-filer tools ('needs a CIK you already hold'). It includes use-case examples ('every 8-K in 2024 Q1') and clarifies error handling, such as HTTP 403 vs. empty results.

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

edgar_lookup_cikA
Read-only

Resolve a company ticker or name to its 10-digit SEC CIK (keyless, via SEC company_tickers.json). Input query (exact ticker or a title substring) ⇒ up to 50 { cik, ticker, title } matches; found:false on none. The CIK is the join key for edgar_company_filings/edgar_company_facts. NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS — there is no authoritative CIK↔UEI join.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesCompany ticker (exact, case-insensitive) or a company-name substring to resolve to a 10-digit SEC CIK via company_tickers.json. e.g. 'AAPL' or 'apple'. Returns up to 50 matches (found:false on none).

TDQS

A4.5/5.0
Behavior3/5

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

Description adds result format and 'found:false' behavior, but annotations already provide readOnlyHint. No additional behavioral context beyond 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?

Concise two-sentence description plus a note. No unnecessary words, front-loaded with 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?

Completely describes tool behavior, including output limit, match details, and key relationship to sibling tools. No output schema needed.

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

Parameters4/5

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

Schema coverage is 100%, but description adds examples (e.g., 'AAPL') and clarifies case-insensitivity and substring matching, adding meaningful context.

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

Purpose5/5

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

Clearly states it resolves ticker/name to CIK via SEC company_tickers.json. Distinguishes from siblings by noting CIK is join key for edgar_company_filings/facts.

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

Usage Guidelines5/5

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

Explicitly notes EDGAR keys on CIK not SAM UEI/DUNS, with no authoritative join, guiding when to use vs. other tools.

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

edgar_xbrl_framesA
Read-only

Keyless cross-filer XBRL cross-section (SEC EDGAR frames, data.sec.gov). In ONE call, return EVERY filer's reported value for a single us-gaap/dei concept in a single calendar period — the complete cross-section — for peer benchmarking + distribution stats. Input tag (EXACT alnum concept, e.g. 'Assets'), period (CY2023 annual · CY2023Q1 quarterly · CY2023Q4I instant/trailing-I), optional taxonomy (us-gaap|dei), unit (default USD; EPS uses 'USD-per-shares'), limit/offset (CLIENT-SIDE window over the fully-fetched set), includeStats. Rows: { accn, cik, entityName, loc, end, val, start? } (start only for duration concepts). HONESTY: totalAvailable = SEC's own pts (asserted === data.length, else schema_drift THROW — no fake completeness); the whole frame is fetched upstream in one call and limit/offset is a disclosed client-side page (never a subset labeled complete); a tag/unit/period mismatch ⇒ 404 ⇒ found:false (NEVER a fabricated val:0); val is null-never-0; includeStats covers the FULL set with linear-interpolated percentiles (count===0 ⇒ all-null, never 0/NaN). taxonomy/tag/unit/period are validated path segments (enum+regex, re-checked pre-fetch) — no injection surface. NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesXBRL concept tag — EXACT, alphanumeric only (e.g. 'Assets', 'Revenues', 'NetIncomeLoss', 'EarningsPerShareBasic'). A non-matching tag ⇒ upstream 404 ⇒ found:false (never a fabricated 0).
unitNoXBRL unit of measure, as a path segment: 'USD' (default), 'shares', 'USD-per-shares' (EPS — HYPHEN, never 'USD/shares'), 'pure'. A valid-shaped but wrong unit ⇒ 404 ⇒ found:false.
limitNoCLIENT-SIDE page size over the already-fully-fetched cross-section (1..1000, default 100). Does NOT reduce the upstream fetch — the whole frame is fetched in one call; this only windows the returned rows (page via _meta.pagination.nextOffset).
offsetNo0-based client-side offset into the fetched cross-section (default 0). Page via _meta.pagination.nextOffset to reach every filer.
periodYesCalendar period frame: CY2023 (annual flow) · CY2023Q1 (quarterly flow, no I) · CY2023Q4I (instant / balance-sheet, trailing I). Instant concepts (e.g. Assets) REQUIRE the trailing I; a mismatch ⇒ 404 ⇒ found:false.
taxonomyNoXBRL taxonomy namespace (a fixed enum — the SSRF guard for this segment): 'us-gaap' (financial statements, default) or 'dei' (entity/document info, e.g. EntityCommonStockSharesOutstanding, EntityPublicFloat). Live-confirmed members only.
includeStatsNoWhen true, compute a summary distribution { count, min, max, sum, mean, median, p25, p75, nonFiniteExcluded } over the FULL cross-section (ALL rows, BEFORE the client-side slice), using linear-interpolated percentiles over the FINITE vals only. count===0 (no finite vals) ⇒ every stat is null (never 0/NaN/Infinity).

TDQS

A4.7/5.0
Behavior5/5

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

The description goes beyond annotations by detailing honest data fetching (whole frame fetched, limit/offset is client-side), error handling (404 instead of fabricated zeros), stat behavior (null when count=0), and validation. This builds trust and sets correct expectations.

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 packed with essential information but is somewhat lengthy. It is front-loaded with the purpose and key details. Every sentence adds value, but it could be slightly more concise without losing clarity.

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?

Given the tool's complexity (7 parameters, no output schema), the description covers behavior, error scenarios, parameter details, and statistical output comprehensively. It leaves no major gaps for an agent to misuse the tool.

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

Parameters5/5

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

Schema coverage is 100%, and the description adds critical nuances: tag must be exact alphanumeric, period requires trailing I for instant concepts, limit/offset are client-side, includeStats details linear-interpolated percentiles and null handling. This clarifies meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the tool's function: returning a complete cross-section of every filer's value for a single US-GAAP/DEI concept in one period for peer benchmarking. It distinguishes from sibling tools like edgar_company_concept by specifying it covers all filers, not just one company.

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 explicitly says to use this tool for cross-filer analysis and benchmarking, providing clear context. While it doesn't list when not to use it or name alternatives, the use case is well-defined, and the parameter descriptions guide correct invocation.

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

epa_tri_facilitiesA
Read-only

Look up EPA Toxics Release Inventory (TRI) reporting facilities by state / facility-name / county — an environmental-footprint / place-of-performance screen (EPA Envirofacts, keyless; data.epa.gov/efservice/tri_facility). Input: state (2-letter, e.g. 'VA'), facilityName (partial match, e.g. 'chemical'), county (partial match) — provide at least state OR facilityName (an all-empty query is refused); optional limit (1–100, default 25), offset. Returns { facilities:[{ triFacilityId, facilityName, streetAddress, city, county, state, zip, region, closed }] } + honest _meta. ★HONESTY: totalAvailable is the EXACT count from a SEPARATE count sub-query (…/count/JSON → TOTALQUERYRESULTS), NEVER the returned-rows length; if that count fails, totalAvailable is null + a disclosing note (never length-faked). offset/limit pagination (hasMore = offset+returned < total). closed normalizes fac_closed_ind ('0'/'N'→false, '1'/'Y'→true, unrecognized→null — never a fabricated false); addresses/names are null-never-empty-string. A genuine no-match ⇒ honest empty (returned:0); a 4xx ⇒ invalid_input/not_found; a 5xx ⇒ THROWS; a 200 non-array/non-JSON ⇒ schema_drift. These are nominal TRI reporters, NOT a compliance/enforcement determination. KEYLESS — no key is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax facilities to return (1–100, default 25). Offset-paginated.
stateNoA 2-letter US state/territory code, e.g. 'VA', 'CA', 'PR' (→ state_abbr; case-insensitive). Provide at least this OR `facilityName`. Validated ^[A-Za-z]{2}$ (it rides in the request path).
countyNoA partial county-name match (→ county_name/CONTAINING/…), e.g. 'FAIRFAX'. Optional additional filter; same charclass as facilityName.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
facilityNameNoA partial facility-name match (→ facility_name/CONTAINING/…; case-insensitive), e.g. 'chemical', 'boeing'. Provide at least this OR `state`. Allowed: letters/digits/space/& - . (≤100 chars); '/' and '..' rejected (path-injection guard).

TDQS

A4.4/5.0
Behavior5/5

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

The description extensively discloses behavioral traits beyond annotations: keyless operation, honest _meta with exact count from separate sub-query, offset/limit pagination with hasMore, normalization of 'closed' field, null-never-empty-string for addresses/names, error handling for 4xx/5xx, and schema drift. It also clarifies that results are nominal TRI reporters, not compliance determinations.

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 lengthy but well-structured with clear sections and symbols (★) highlighting key information. Each sentence adds value, though it could be slightly more concise. It is appropriately front-loaded with the core 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?

Given the complexity of the tool (5 parameters, no output schema), the description is remarkably complete. It covers input requirements, output format, pagination, error handling, honesty guarantees, and limitations. It fully compensates for the lack of an output schema by explicitly describing the return shape.

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

Parameters3/5

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

The input schema already has 100% description coverage for all 5 parameters, so the baseline is 3. The description adds some extra context (e.g., validation for state, path-injection guard for facilityName) but does not significantly extend meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Look up EPA Toxics Release Inventory (TRI) reporting facilities by state / facility-name / county — an environmental-footprint / place-of-performance screen'. It specifies the verb, resource, and filtering criteria, distinguishing it from sibling tools that cover other data domains.

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

Usage Guidelines4/5

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

The description provides explicit usage guidelines: 'provide at least state OR facilityName (an all-empty query is refused); optional limit (1–100, default 25), offset'. It also details error handling and pagination. However, it does not explicitly compare to sibling tools or state when not to use this tool.

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

fac_get_findingsA
Read-only

Drill into the audit-RISK findings for an entity from the Federal Audit Clearinghouse (keyless via the api.data.gov DEMO_KEY; api.fac.gov PostgREST findings table) — the risk-detail step after fac_search_audits. At least ONE of auditeeUei (12-char UEI → auditee_uei) or reportId (→ report_id, from a fac_search_audits row) is REQUIRED (an empty query is refused, never a whole-table scan); optional auditYear (int), limit (≤100, def 50), offset. Returns { findings:[{ report_id, auditee_uei, audit_year, award_reference, reference_number, is_material_weakness, is_modified_opinion, is_questioned_costs, is_repeat_finding, is_significant_deficiency, is_other_findings, is_other_matters, type_requirement, prior_finding_ref_numbers, riskFlags:{materialWeakness, modifiedOpinion, questionedCosts, repeatFinding, significantDeficiency, otherFindings, otherMatters} }] } + honest meta. ★RISK-FLAG HONESTY: the is* flags are surfaced VERBATIM as the auditor reported them ("Y"/"N") PLUS a typed riskFlags tri-state ("Y"→true / "N"→false / blank/absent/other → null=UNKNOWN) — a null flag is NEVER rendered as false/"no material weakness" (the false-CLEAR class). ★EMPTY ≠ CLEAN: an empty findings list does NOT confirm a clean audit — the entity may not have filed a Single Audit (below the $750K threshold), the audit may predate FAC coverage, or the UEI may be wrong; a disclosure note fires on any empty result telling you to confirm an ACCEPTED audit exists via fac_search_audits. ★PII: a HARDCODED select-allowlist (NO caller column param) surfaces only entity + audit-risk fields — no personal contact. totalAvailable is the EXACT Content-Range total ('*'/absent ⇒ null + hedge, never 0); a bad column ⇒ 400 ⇒ invalid_input; 400/403/5xx/timeout/HTML/non-array THROW (206 = success). NOT a debarment/determination — cross-check SAM exclusions + OFAC + the specific finding text. Keyless-first via DEMO_KEY (~10 req/hr; set DATA_GOV_API_KEY — never logged).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows per page, 1..100, default 50.
offsetNo0-based row offset for pagination (default 0).
reportIdNoFilter by FAC report_id (^[0-9A-Za-z-]+$; → report_id=eq. — from a fac_search_audits row).
auditYearNoFilter by audit year (int, → audit_year=eq.).
auditeeUeiNoFilter by 12-char SAM UEI (^[A-Z0-9]{12}$; → auditee_uei=eq.).

TDQS

A4.7/5.0
Behavior5/5

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

The description adds significant context beyond annotations: risk-flag honesty (tri-state vs false-CLEAR), empty results not implying clean audit, PII protection via hardcoded select-allowlist, totalAvailable behavior, error handling (400/403/5xx throw), and rate limiting for DEMO_KEY. No contradictions with annotations (readOnlyHint and openWorldHint are consistent).

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 well-structured with bullet points and emojis, packing a lot of information efficiently. It is somewhat lengthy, but every sentence adds essential detail. A slight reduction in verbosity could improve conciseness, but it remains effective.

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

Completeness4/5

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

Given the complexity of the tool (nuanced risk flags, empty results, PII, error handling) and the lack of an output schema, the description covers most critical aspects: purpose, parameters, behavior, limitations, and caveats. It partially describes the return structure (findings array with riskFlags). While more detail on output shape could help, it is sufficiently complete for proper usage.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds value by indicating that at least one of auditeeUei or reportId is required (schema says all optional), mapping field names (auditeeUei → auditee_uei, reportId → report_id), and specifying limit's maximum and default. This goes beyond the schema, justifying a score above baseline 3.

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 verb 'Drill into' and identifies the resource as 'audit-RISK findings for an entity from the Federal Audit Clearinghouse.' It also distinguishes itself from sibling tools by noting it is 'the risk-detail step after fac_search_audits,' making its purpose unambiguous.

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

Usage Guidelines5/5

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

The description explicitly states the required parameters ('At least ONE of auditeeUei or reportId'), provides defaults and limits, and warns against using it for debarment determination. It also explains how to interpret empty results and suggests cross-referencing with fac_search_audits, giving clear guidance on when and how to use the tool.

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

fac_search_auditsA
Read-only

Search entity Single Audit summaries from the Federal Audit Clearinghouse (keyless via the api.data.gov DEMO_KEY; api.fac.gov PostgREST general table) — the SUBCONTRACTOR / teaming AUDIT-RISK vetting entry point (2 CFR 200 Subpart F / Single Audit Act; every entity expending ≥$750K/yr in federal awards). Structured filters (all optional, AND-combined): auditeeUei (12-char SAM UEI — the PRIMARY join key to SAM/USAspending/EDGAR, → auditee_uei), auditeeState (2-letter → auditee_state), auditYear (int → audit_year), totalExpendedMin/totalExpendedMax (USD → total_amount_expended gte/lte). limit (≤100, def 25), offset. Returns { audits:[{ report_id, auditee_uei, audit_year, auditee_name, auditee_ein, auditee_state, auditee_city, total_amount_expended, fac_accepted_date }] } + honest _meta. Feed a row's report_id (or the UEI) to fac_get_findings for the audit-RISK flags. ★PII: a HARDCODED select-allowlist surfaces ONLY entity + audit-summary fields and DELIBERATELY EXCLUDES the auditee's personal-contact columns (email/phone/certifying-official name) — the vetting subject is the ENTITY; there is NO caller select/column param. HONESTY: totalAvailable is the EXACT Content-Range total (a response header under Prefer:count=exact; a '*'/absent/non-numeric denominator ⇒ totalAvailable:null + a page-fullness hedge, NEVER 0); total_amount_expended is null-never-0 (a missing amount is null, never 0); a bad column ⇒ PostgREST 400 ⇒ invalid_input (filtersDropped is ALWAYS empty); a genuine [] ⇒ honest empty; 400/403/5xx/timeout/HTML/non-array THROW (206 = success, never a fake empty). NOT a debarment/exclusion/fitness determination — an audit finding is the auditor's opinion; cross-check SAM exclusions + OFAC. Keyless-first via DEMO_KEY (~10 req/hr shared ceiling; set DATA_GOV_API_KEY for production — never logged).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows per page, 1..100, default 25.
offsetNo0-based row offset for pagination (default 0).
auditYearNoFilter by audit year (int, → audit_year=eq.). e.g. 2024.
auditeeUeiNoFilter by 12-char SAM UEI (^[A-Z0-9]{12}$; → auditee_uei=eq. — the PRIMARY join key to SAM/USAspending/EDGAR). e.g. 'ZQGGHJH74DW7'.
auditeeStateNoFilter by 2-letter US state code (uppercase; → auditee_state=eq.). e.g. 'CA'.
totalExpendedMaxNoMaximum total federal awards expended (USD, → total_amount_expended=lte.).
totalExpendedMinNoMinimum total federal awards expended (USD, → total_amount_expended=gte.).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint and openWorldHint. Description adds substantial behavioral details: PII exclusion, honest handling of totalAvailable and total_amount_expended, error behaviors (e.g., 206 success, non-array throw), and rate limits. Far exceeds annotation-only information.

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?

Description is dense and well-structured with clear sections (PII, HONESTY, etc.), but slightly verbose due to extensive edge-case details. Front-loaded purpose is good.

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?

Complete coverage for a parameter-rich tool with no output schema. Describes return format, pagination, error behavior, and integration with fac_get_findings. All necessary context for agent invocation.

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

Parameters4/5

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

Schema coverage is 100% with descriptions. Description adds value by explaining auditeeUei as primary join key, state code casing, min/max for totalExpended, and default/bound for limit. Slight improvement over schema alone.

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

Purpose5/5

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

Clearly states it searches entity Single Audit summaries from the Federal Audit Clearinghouse for audit-risk vetting. Provides source details and distinguishes from sibling tool fac_get_findings by mentioning how to feed report_id.

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

Usage Guidelines4/5

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

Explicitly identifies as entry point for subcontractor/teaming risk vetting under 2 CFR 200. Clarifies it is not a debarment/exclusion determination and directs cross-checking with SAM/OFAC. Notes keyless usage and production key. Does not explicitly list alternatives, but context is sufficient.

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

far_clause_lookupA
Read-only

Authoritative FAR/DFARS clause text + its PRESCRIPTION (the 'As prescribed in …' rule for when the clause applies), from the eCFR versioner-full endpoint (Title 48). Use this — NOT ecfr_search — for an EXACT clause number: full-text search mis-ranks '52.212-4' (returns GSAM 552.212-4 above the real FAR clause). Returns heading, revision date, clause/provision kind, regulation (FAR/DFARS/GSAM), full text, the prescribing section, and ecfrUrl. Every response carries farOverhaulRisk — a structural currency caveat that eCFR reflects only the CODIFIED FAR, so a clause may be superseded by a Revolutionary-FAR-Overhaul agency class deviation not shown here. A genuinely-absent clause returns a not_found error (never a fake empty clause). Keyless.

ParametersJSON Schema
NameRequiredDescriptionDefault
asOfDateNoPoint-in-time codification date (YYYY-MM-DD). Defaults to Title 48's current up_to_date_as_of.
clauseNumberYesFAR or DFARS clause/provision number, e.g. '52.212-4', '252.204-7012', '52.204-25'. An optional 'FAR '/'DFARS ' prefix is stripped.
includePrescriptionNoAlso fetch the prescribing section parsed from the clause's 'As prescribed in …' opener (the rule for WHEN the clause applies). Default true.

TDQS

A4.8/5.0
Behavior5/5

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

Discloses farOverhaulRisk caveat about codified FAR supersession, describes return fields (heading, revision date, kind, regulation, full text, prescribing section, ecfrUrl), and states that absent clauses return a not_found error. This goes well beyond the readOnlyHint and openWorldHint annotations.

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 dense and informative, front-loading the core purpose and key differentiator. It contains a useful caveat about farOverhaulRisk and error handling. While slightly long, every sentence adds value, so it earns a 4.

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?

With no output schema, the description fully enumerates return fields (heading, revision date, etc.) and error semantics. Given the tool's regulatory complexity, the description is complete and leaves no ambiguity about what the agent can expect.

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 has 100% coverage with descriptions for all three parameters (clauseNumber, asOfDate, includePrescription). The description adds value by explaining the default behavior of includePrescription (true) and giving examples of clause formats. However, since schema already describes parameters, the description's incremental contribution is moderate.

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 it provides authoritative FAR/DFARS clause text and its prescription (use condition). It explicitly distinguishes from the sibling ecfr_search by warning that ecfr_search mis-ranks exact clause numbers, so this tool is the correct one for exact lookup.

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

Usage Guidelines5/5

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

Explicit guidance to use this tool instead of ecfr_search for exact clause numbers, with a concrete example of why (mis-ranking 52.212-4). Also notes keyless access and error behavior for absent clauses, providing clear usage context.

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

far_compliance_matrixA
Read-only

Turn a solicitation's cited FAR/DFARS clause list into a proposal-ready compliance matrix (for a Section L/M response). COMPOSES far_clause_lookup over 1–25 clauses (deduped case-insensitively): each resolved row carries the clause text + prescription + regulation + a gate flag marking pass/fail award-eligibility GATES (Section 889 52.204-24/25/26, limitations on subcontracting 52.219-14, DFARS cyber 252.204-7012/7020/7021 incl. CMMC) + the farOverhaulRisk currency caveat. TRUTHFUL by construction: a clause that genuinely isn't in Title 48 (HTTP 404) goes to unresolved, while a clause that couldn't be fetched (eCFR down/5xx/rate-limited) goes to a SEPARATE errored bucket — a DOWN service is never reported as 'clause doesn't exist'; summary.total proves no clause is dropped. Does NOT parse the PDF solicitation to extract the clause list, and gives NO legal advice or compliance verdict. Keyless.

ParametersJSON Schema
NameRequiredDescriptionDefault
clausesYesThe FAR/DFARS clause numbers a solicitation cites (e.g. from its 52.252-2 'Clauses Incorporated by Reference' list), 1–25. Deduped case-insensitively. e.g. ['52.212-4','52.204-25','252.204-7012'].
asOfDateNoPoint-in-time codification date (YYYY-MM-DD) — typically the solicitation issue date. Defaults to Title 48's current up_to_date_as_of.
flagGatesNoTag resolved rows that are pass/fail award-eligibility gates (Section 889, CMMC, limitations on subcontracting) with a gate label; others get gate:null. Default true. false ⇒ all gate:null.
includePrescriptionNoAlso fetch each clause's prescribing section (the 'As prescribed in …' rule for WHEN it applies). Default true.

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint and openWorldHint annotations. It details how unresolved clauses are handled (404 vs errored buckets), deduping case-insensitively, gate flagging behavior, and the asOfDate parameter for point-in-time codification. It also notes 'Keyless' for authentication. This provides comprehensive behavioral disclosure.

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 relatively long but every sentence provides necessary detail. It is front-loaded with the main purpose. Some minor redundancy (e.g., 'TRUTHFUL by construction' could be integrated), but overall it is well-structured and efficient for the complexity.

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?

Given the tool's complexity (composing far_clause_lookup, error handling, gate flags, point-in-time) and the absence of an output schema, the description is remarkably complete. It explains each output field (clause text, prescription, regulation, gate flag) and the summary.total field. It covers edge cases like unresolved vs errored clauses and the purpose of each parameter.

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?

All four parameters have descriptions in the input schema (100% coverage), so the baseline is 3. The description adds extra context beyond the schema: it explains that clauses come from e.g., 52.252-2 lists, deduping is case-insensitive, defaults for boolean parameters (flagGates and includePrescription default true), and the asOfDate defaults to current up_to_date_as_of. This adds significant value.

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 action: 'Turn a solicitation's cited FAR/DFARS clause list into a proposal-ready compliance matrix.' It specifies the input (clause list) and output (matrix for Section L/M response). It distinguishes from siblings by noting it composes far_clause_lookup over multiple clauses, which is a distinct function from individual lookup tools.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool (have a list of clause numbers from a solicitation) and what it does not do: 'Does NOT parse the PDF solicitation to extract the clause list, and gives NO legal advice or compliance verdict.' It also notes 'for a Section L/M response,' providing context. While it doesn't directly compare to siblings, the purpose is self-contained.

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

fdic_bank_failuresA
Read-only

Historical FDIC-insured bank failures & assistance transactions (keyless FDIC BankFind, api.fdic.gov/banks/failures) — B2G counterparty / entity due-diligence: a failed or FDIC-assisted institution is a red flag, and CERT links a failure back to fdic_search_institutions / fdic_institution_financials. Exact-key filters: state (2-letter → PSTALP — NOTE the /failures state field is PSTALP, NOT STALP), failYear (→ FAILYR; e.g. 2023 → the 5 real 2023 failures incl. Silicon Valley Bank & First Republic Bank), cert (→ CERT, the STABLE entity key). limit (≤1000, def 100), offset (≤100000), sortBy (allowlisted enum FAILDATE/COST/QBFASSET/QBFDEP/NAME/FAILYR, def FAILDATE), sortOrder (def DESC → most-recent first). Returns { failures:[{ name, cert, failDate, failYear, city, state, resolutionType, resolutionFund, estimatedLossUSD, depositsUSD, assetsUSD, id }] }. NO name/city filter — FDIC's /failures search param is IGNORED (it returns the whole dataset), so name/city are SHOWN in each row but NOT searchable; to find a specific bank's failure, resolve its CERT via fdic_search_institutions then filter here by cert. HONESTY: totalAvailable is the EXACT meta.total (stable across offset — never the page length); failDate is normalized from FDIC's M/D/YYYY to ISO YYYY-MM-DD (an unrecognized value is surfaced raw + disclosed, never nulled/fabricated); COST/QBFDEP/QBFASSET are $thousands normalized to whole USD ×1000 (null-never-0 — a genuine 0 = a fully-assisted no-loss stays 0, a NEGATIVE COST = a net DIF recovery/gain not a loss, absent → null); the ONLY honest empty is meta.total:0/data:[] ⇒ complete:true/total:0, every other envelope (400 errors[]/404/non-JSON/missing meta or data) THROWS (never a fake empty); the point-in-time snapshot build time is disclosed. NOTE: FDIC keys on CERT, not SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
certNoFilter by FDIC certificate number (the STABLE entity key; → CERT filter). Resolve a bank's CERT via fdic_search_institutions.
limitNoRows per page, 1..1000, default 100.
stateNoFilter by 2-letter US state code (uppercase; → PSTALP filter — the /failures state field is PSTALP, NOT STALP). e.g. 'CA'.
offsetNo0-based row offset for pagination, 0..100000, default 0.
sortByNoSort field (allowlisted enum; default FAILDATE = failure date). An unknown field is rejected before fetch.
failYearNoFilter by year of failure (→ FAILYR filter). 1934..current UTC year. e.g. 2023 → the 5 real 2023 failures (Silicon Valley Bank, Signature Bank, First Republic Bank, Heartland Tri-State Bank, Citizens Bank).
sortOrderNoSort direction, default DESC (most-recent failures first).

TDQS

A4.9/5.0
Behavior5/5

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

Goes far beyond annotations by detailing data normalization (dates to ISO, financials to USD), handling of zeros and negatives, error behavior (throws on non-200), and disclosure of snapshot build time. All annotations (readOnlyHint, openWorldHint) are respected and expanded.

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?

Long but well-structured with clear sections; front-loads purpose and use. Every sentence is informative, though some internal detail (e.g., HONESTY block) could be slightly condensed without losing clarity.

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?

Fully covers return shape, pagination, sorting, filtering limitations, data integrity, and cross-tool linking. Lacks output schema but description provides return field list. Handles complexity of 7 parameters and many siblings comprehensively.

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

Parameters5/5

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

Adds significant meaning beyond the schema: explains field name mappings (PSTALP vs STALP, FAILYR), provides examples for failYear, clarifies that sortBy unknown fields are rejected, and notes bounds for limit/offset. Schema coverage is 100%, but description still adds value.

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

Purpose5/5

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

Clearly identifies the tool as returning historical FDIC-insured bank failures and assistance transactions, with specific verb 'returns' and resource. Distinguishes from sibling FDIC tools by noting CERT links to fdic_search_institutions and fdic_institution_financials.

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

Usage Guidelines5/5

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

Provides explicit guidance on when to use (due diligence on failed institutions), how to filter (exact-key filters for state, failYear, cert), and what not to do (no name/city filter; alternative: resolve CERT via fdic_search_institutions). Includes defaults, limits, and examples.

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

fdic_branch_depositsA
Read-only

FDIC branch-deposit footprint — the Summary of Deposits (keyless FDIC BankFind, api.fdic.gov/banks/sod): the annual June-30 branch-office deposit distribution ('where does this bank hold deposits, and how concentrated?'). Exact-key filters (all optional, AND-combined; ≥1 recommended): cert (→ CERT, the STABLE entity key), state (2-letter → STALPBR, the branch-state field, C118-quoted so Oregon is operator-safe), year (→ YEAR, the June-30 snapshot year). limit (≤1000, def 100), offset (≤100000), sortBy (allowlisted enum YEAR/DEPSUMBR, def YEAR), sortOrder (def DESC → newest snapshot / largest deposits first). Returns { branches:[{ cert, institutionName, branchNumber, branchName, city, state, zip, address, depositsUSD, year, id }] } (e.g. CERT 10004 → 74 branch-year rows). HONESTY: totalAvailable is the EXACT meta.total (stable across offset — never the page length); depositsUSD is DEPSUMBR published in $thousands, normalized to whole USD ×1000 (null-never-0 — a real 0 stays 0, absent → null); a bad/mistyped filter field can never reach the wire (server-side allowlist by construction — FDIC would otherwise return a silent total:0 false-empty, not an error); the ONLY honest empty is meta.total:0/data:[] ⇒ complete:true/total:0, every other envelope (400 errors[]/404/non-JSON/missing meta or data) THROWS (never a fake empty); the DISTINCT annual snapshot build time is disclosed. Branch facility data only (name/address/city/state/zip/deposits) — no personal/officer PII. NOTE: SOD is an annual June-30 snapshot; FDIC keys on CERT, not SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
certNoFilter by FDIC certificate number (the STABLE entity key; → CERT filter). Resolve a bank's CERT via fdic_search_institutions.
yearNoFilter by Summary-of-Deposits survey YEAR (→ YEAR filter), the annual June-30 snapshot year. 1934..current UTC year.
limitNoRows per page, 1..1000, default 100.
stateNoFilter by 2-letter branch state code (uppercase; → STALPBR filter — the SOD branch-state field). e.g. 'OR'. C118-quoted so Oregon is Lucene-operator-safe.
offsetNo0-based row offset for pagination, 0..100000, default 0.
sortByNoSort field (allowlisted enum; default YEAR = snapshot year). An unknown field is rejected before fetch.
sortOrderNoSort direction, default DESC (newest snapshot / largest deposits first).

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint annotation by detailing the meaning of depositsUSD (conversion from thousands, null handling), error behavior (server-side allowlist, only honest empty is meta.total:0), and data limitations (annual snapshot, no PII). It also discusses totalAvailable behavior, adding significant context.

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 dense and informative, but somewhat long. It is front-loaded with the purpose, then lists parameters, then provides behavioral notes. Every sentence adds value, but some details could be streamlined for brevity.

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?

Given the tool has 7 parameters, no output schema, and no nested objects, the description is thorough: it covers all parameters, output structure, example rows, pagination, error handling, and data semantics. No important aspect is missing.

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

Parameters5/5

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

Although the input schema has 100% coverage, the description adds substantial meaning: cert is the stable entity key, state uses C118 quoting, sortBy options are explained, and the returned fields (e.g., depositsUSD, institutionName) are described in context. This goes beyond the schema 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 retrieves FDIC branch-deposit footprints from the Summary of Deposits, specifying it provides annual June-30 branch-office deposit distribution. It uses specific verbs ('retrieve', 'footprint') and distinguishes itself from sibling tools like fdic_institution_financials by focusing on branch deposits.

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 explains that all filters are optional and recommends using at least one, provides guidance on pagination parameters (limit, offset) and sorting, and implicitly distinguishes from other FDIC tools by the data type. However, it does not explicitly state when not to use this tool or mention alternative tools for related data.

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

fdic_industry_summaryA
Read-only

FDIC industry & state banking-sector ANNUAL AGGREGATES — the FDIC's own roll-ups (keyless FDIC BankFind, api.fdic.gov/banks/summary). The FIRST aggregate/statistical FDIC tool (the other 4 are per-ENTITY, keyed on CERT): total assets, deposits, net income, equity & net interest income + structural counts (institutions, offices, branches, employees) for the whole US banking industry OR one state/territory in one year, split by charter class. Answers 'how big is the US (or a state's) banking industry this year, and how many institutions?' — a question the entity tools cannot express without summing thousands of rows. Exact-key filters (all optional, AND-combined): year (→ YEAR; e.g. 2023 → 121 rows), state (2-or-3-letter → STALP — NOTE the /summary state field is STALP, NOT PSTALP; accepts a jurisdiction code TX/CA/DC/GU/PR… OR a ROLL-UP code USA/US/OT/PI), charterClass (CB = commercial banks, SI = savings institutions; omit for both — there is NO combined row). limit (≤1000, def 100), offset (≤100000), sortBy (allowlisted enum YEAR/ASSET/DEP/NETINC/BANKS, def YEAR), sortOrder (def DESC → newest year / largest first). Returns { summary:[{ year, charterClass, charterClassCode, geography, stateCode, stateFips, scope, isRollup, institutionCount, officeCount, branchCount, employeeCount, totalAssetsUSD, totalDepositsUSD, netIncomeUSD, totalEquityUSD, netInterestIncomeUSD, id }] }. ★ROLL-UP HONESTY: each row crosses charter × geography; STALP ∈ {USA,US,OT,PI} are GEOGRAPHIC AGGREGATES (scope national_total/national_states_dc/territories_total/pacific_islands, isRollup:true), every other STALP is a jurisdiction (isRollup:false) — NEVER sum a roll-up row with jurisdiction rows or across scopes (national_total = national_states_dc + territories_total; a geography's total = its CB row + its SI row), read the national_total (USA) row directly for one national figure; a roll-up is NOT a state. ★NIM is net interest INCOME (a $ sum surfaced as netInterestIncomeUSD), NOT the margin ratio; this endpoint has NO ratio fields (ROA/ROE — derive from netIncomeUSD/totalAssetsUSD/totalEquityUSD). NO name/city filter — FDIC's /summary search param is ignored (returns the whole year); drill to institutions via fdic_search_institutions. HONESTY: totalAvailable is the EXACT meta.total (stable across offset — never the page length); money (ASSET/DEP/NETINC/EQ/NIM) is $thousands → whole USD ×1000 (null-never-0 — a genuine 0 like American Samoa's zero commercial banks stays 0, absent → null), counts (BANKS/OFFICES/BRANCHES/employees) pass through un-scaled (a count ×1000 is a fabrication); a non-int year is rejected pre-fetch (a malformed year is a live HTTP-200 total:0 false-empty); the ONLY honest empty is meta.total:0/data:[] ⇒ complete:true/total:0, every other envelope (400 errors[]/404/non-JSON/missing meta or data) THROWS (never a fake empty); the point-in-time snapshot build time is disclosed. NOTE: FDIC keys on CERT, not SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFilter by aggregate YEAR (→ YEAR filter). 1934..current UTC year. e.g. 2023 → the 121 (charter × geography) aggregate rows for 2023. A non-int is rejected pre-fetch (a malformed year is a live HTTP-200 total:0 false-empty).
limitNoRows per page, 1..1000, default 100.
stateNoFilter by geography via the STALP code (uppercase 2-or-3 letters; → STALP filter — the /summary state field is STALP, NOT PSTALP). Accepts a jurisdiction USPS code (TX, CA, DC, GU, PR…) OR a ROLL-UP code: USA (all states+territories), US (states+DC), OT (all territories), PI (Pacific Islands). The output scope/isRollup disambiguates every returned row.
offsetNo0-based row offset for pagination, 0..100000, default 0.
sortByNoSort field (allowlisted enum; default YEAR = aggregate year). An unknown field is rejected before fetch.
sortOrderNoSort direction, default DESC (newest year / largest first).
charterClassNoFilter by charter class (→ CB_SI filter): CB = commercial banks, SI = savings institutions. Omit to return BOTH charter rows for the geography — there is NO pre-combined 'all institutions' row (a geography's total = its CB row + its SI row).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds extensive behavioral context: roll-up honesty, that NIM is net interest income (not margin), no ratio fields, money in $thousands, counts unscaled, error handling (non-int year rejected, honest empty), and build-time disclosure. No contradictions.

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 verbose (almost 500 words) and contains many details that could be streamlined. It is well-organized with bullet-like sections and a clear front-loaded summary, but could be more concise for an AI agent. Structure is good but length reduces conciseness.

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?

Given the 7 parameters, 100% schema coverage, good annotations, and no output schema, the description is exceptionally complete. It explains output structure, edge cases, roll-up behavior, and limitations thoroughly. An AI agent has all necessary context to use the tool correctly.

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

Parameters5/5

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

Schema description coverage is 100%. The description adds meaningful context beyond schema: for year, notes rejection of non-integers; for state, explains STALP vs PSTALP and roll-up codes; for charterClass, clarifies omission returns both rows; for sortBy/sortOrder, defines defaults. Adds value by explaining the meaning of enum values and constraints.

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 it provides FDIC industry & state banking-sector annual aggregates, and distinguishes itself from the other four FDIC tools which are per-entity keyed on CERT. It uses specific verbs and resources: 'roll-ups', 'total assets, deposits, net income, equity & net interest income + structural counts'.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool: to answer questions about the size of the US/state banking industry that entity tools cannot express without summing thousands of rows. Also provides alternatives: 'drill to institutions via fdic_search_institutions' and notes what the tool does not do (no name/city filter, no ratio fields).

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

fdic_institution_financialsA
Read-only

Quarterly financial time-series for ONE FDIC-insured institution by certificate number (keyless FDIC BankFind, api.fdic.gov/banks/financials). Input cert (REQUIRED FDIC certificate number, from fdic_search_institutions), limit (≤1000, def 100), offset (≤100000), sortBy (allowlisted enum REPDTE/ASSET/DEP/NETINC, def REPDTE), sortOrder (def DESC → newest quarter first). Returns { cert, financials:[{ cert, reportDate, assetUSD, depositsUSD, netIncomeUSD, id }] } (e.g. CERT 10363 → 169 quarterly rows). HONESTY: totalAvailable is the EXACT meta.total (stable across offset — page via offset for the full history); ASSET/DEP/NETINC are published in $thousands and normalized to whole USD ×1000 (null-never-0); the ONLY honest empty is meta.total:0/data:[] ⇒ complete:true/total:0, every other envelope THROWS (never a fake empty); the snapshot build time is disclosed.

ParametersJSON Schema
NameRequiredDescriptionDefault
certYesREQUIRED FDIC certificate number of the institution (→ CERT filter). From fdic_search_institutions.
limitNoRows per page, 1..1000, default 100.
offsetNo0-based row offset for pagination, 0..100000, default 0.
sortByNoSort field (allowlisted enum; default REPDTE = report date).
sortOrderNoSort direction, default DESC (newest quarter first).

TDQS

A4.4/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint and openWorldHint annotations. It discloses the exact return envelope structure, normalization of financial fields (ASSET/DEP/NETINC in $thousands to USD), the honesty about totalAvailable being exact, error handling (only works if meta.total > 0, otherwise throws), and snapshot build time. No contradiction with 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 well-structured: purpose first, then parameter details, return envelope, and honesty notes. Every sentence adds value, and there is no fluff. It is concise yet comprehensive for the complexity of the tool.

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

Completeness4/5

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

Given the lack of an output schema, the description does a good job explaining the return shape (cert, financials array with specific fields) and providing an example. It covers pagination, sorting, error handling, and the data source. It is nearly complete, though it could explicitly mention the date format or other potential edge cases.

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

Parameters3/5

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

Schema coverage is 100% with good descriptions for all 5 parameters. The description adds minor value by restating defaults, specifying the source of cert (fdic_search_institutions), and clarifying the meaning of the default sortOrder (newest quarter first). However, it does not add substantial new semantics beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states the tool returns quarterly financial time-series for one FDIC-insured institution by certificate number. It distinguishes this from sibling FDIC tools like search_institutions, bank_failures, industry_summary, etc., by specifying it is for a single institution and the data source is the FDIC BankFind API.

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 explains that the 'cert' parameter is required and comes from fdic_search_institutions, and provides pagination and sorting defaults. While it does not explicitly state when not to use this tool versus siblings, the context of the description (financials for one institution) combined with sibling tool names makes the use case clear.

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

fdic_institution_historyA
Read-only

Institution-level STRUCTURAL-CHANGE event log for FDIC-insured banks (keyless FDIC BankFind, api.fdic.gov/banks/history) — the full lineage of mergers, absorptions, consolidations, failures, name/location/charter/regulator changes, branch open/close, trust-power grants & FRS-membership changes. Completes the FDIC entity cluster (directory + financials + failures + history). Killer feature: CERT-linked MERGER LINEAGE — a merger/failure row carries the acquiring / outgoing / surviving institution's CERT + name, each linking back to fdic_search_institutions / fdic_institution_financials / fdic_bank_failures. Exact-key filters (all optional, AND-combined): cert (→ CERT, the STABLE entity key & PRIMARY lookup; e.g. 3510 → Bank of America's 13,794 rows), changeCode (→ CHANGECODE; e.g. 223 = merger, 211 = failure, 721 = branch closing, 520 = location change), effYear (→ EFFYEAR), state (2-letter → PSTALP — NOTE the /history state field is PSTALP, NOT STALP). limit (≤1000, def 100), offset (≤100000), sortBy (allowlisted enum EFFDATE/PROCDATE/CHANGECODE/TRANSNUM, def EFFDATE), sortOrder (def DESC → newest change first). Returns { history:[{ cert, instName, state, changeCode, changeDescription, effectiveDate, processDate, effYear, transNum, acquirerCert, acquirerName, outgoingCert, outgoingName, survivingCert, survivingName, id }] }. NO name/city filter — FDIC's /history search param returns 0 for INSTNAME (a false-empty), so names are SHOWN in each row but NOT searchable; to find a specific bank's history, resolve its CERT via fdic_search_institutions then filter here by cert. HONESTY: totalAvailable is the EXACT meta.total (stable across offset — never the page length); changeDescription is FDIC's OWN co-served CHANGECODE_DESC passed through verbatim (the numeric changeCode is authoritative — never a hand-map); effectiveDate/processDate are normalized from FDIC's YYYY-MM-DDT00:00:00 to ISO YYYY-MM-DD (an unrecognized value is surfaced raw + disclosed, never nulled/fabricated); the acquirer/outgoing/surviving CERTs are null on a non-merger event (null-never-0 — a real absence, never a fabricated 0; *_UNINUM's 0 sentinel is NOT surfaced); the ONLY honest empty is meta.total:0/data:[] ⇒ complete:true/total:0, every other envelope (400 errors[]/404/non-JSON/missing meta or data) THROWS (never a fake empty); the point-in-time snapshot build time is disclosed. NOTE: FDIC keys on CERT, not SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
certNoFilter by FDIC certificate number (the STABLE entity key; → CERT filter — the PRIMARY lookup). Resolve a bank's CERT via fdic_search_institutions. e.g. 3510 → Bank of America's 13,794-row structural-change history.
limitNoRows per page, 1..1000, default 100.
stateNoFilter by 2-letter US state code (uppercase; → PSTALP filter — the /history state field is PSTALP, NOT STALP). e.g. 'CA'.
offsetNo0-based row offset for pagination, 0..100000, default 0.
sortByNoSort field (allowlisted enum; default EFFDATE = effective date). An unknown field is rejected before fetch.
effYearNoFilter by the year the structural change took effect (→ EFFYEAR filter). 1782..current UTC year (1782 = the oldest observed EFFYEAR).
sortOrderNoSort direction, default DESC (newest structural change first).
changeCodeNoFilter by FDIC structural-change code (→ CHANGECODE filter). e.g. 223 = Merger (Without Assistance), 211 = Failure (Whole Institution), 721 = Branch Closing, 520 = Change in Physical Location, 110 = New Institution. Each row also carries FDIC's own changeDescription (CHANGECODE_DESC).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations, describes data source, why name filter returns false empty, exact key filter behavior, and an honesty section detailing totalAvailable, changeDescription, date normalization, null vs 0, and error handling.

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?

Densely packed with useful information; front-loaded with main purpose. The honesty section is lengthy but necessary for behavioral trust, so not overly verbose for the value provided.

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

Completeness5/5

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

No output schema, but description fully explains return fields and edge cases (false empty, null vs 0, error handling). Very complete for a complex tool with 8 optional parameters.

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 already covers all parameters with descriptions; the tool description adds extra context like cert being a stable key, state field differentiation (PSTALP vs STALP), and examples, but schema already does the heavy lifting.

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 it is an event log for structural changes of FDIC-insured banks, listing specific event types and distinguishing from sibling tools like fdic_search_institutions and fdic_bank_failures.

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

Usage Guidelines5/5

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

Provides explicit guidance on when to use (e.g., for CERT-linked merger lineage) and when not to use (no name/city filter), and directs to resolve CERT via fdic_search_institutions first.

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

fdic_risk_ratiosA
Read-only

FDIC counterparty RISK RATIOS for ONE institution by certificate number (keyless FDIC BankFind, api.fdic.gov/banks/financials) — the SOUNDNESS lane the balance-sheet tools cannot express: profitability (ROA/pretax ROA/ROE), net interest margin, efficiency ratio, asset quality (net charge-offs to loans), capital adequacy (leverage, tier-1 risk-based, total risk-based ratios) + the tier-1 capital LEVEL. Input cert (REQUIRED FDIC certificate number, from fdic_search_institutions), reportDate (optional YYYYMMDD quarter-end → REPDTE; omit for the full quarterly time-series), limit (≤1000, def 100), offset (≤100000), sortBy (allowlisted enum REPDTE/ROA/ROE/RBCRWAJ/EEFFR, def REPDTE), sortOrder (def DESC → newest quarter first). Returns { cert, ratios:[{ cert, reportDate, cblrFramework, returnOnAssetsPct, preTaxReturnOnAssetsPct, returnOnEquityPct, netInterestMarginPct, efficiencyRatioPct, netChargeOffsToLoansPct, leverageRatioPct, tier1RiskBasedCapitalRatioPct, totalRiskBasedCapitalRatioPct, tier1CapitalUSD, id }] }. ★UNITS-IN-THE-KEY: every *Pct field is an FDIC-published PERCENTAGE surfaced VERBATIM (no scaling, no recompute) — do NOT read it as a dollar amount or ×1000-scale it; tier1CapitalUSD is a DOLLAR amount (FDIC publishes it in $thousands, normalized ×1000). ★NULL-NEVER-0: a not-reported ratio is null (never 0% — a false 'no return / no capital'). ★CBLR (community-bank-leverage) banks (cblrFramework:true) do NOT report the risk-based capital ratios — FDIC returns a literal 0 for the total risk-based ratio, which this tool maps to null for BOTH tier1RiskBasedCapitalRatioPct and totalRiskBasedCapitalRatioPct (a null there is a normal framework artifact, read alongside leverageRatioPct — NOT a 0% capital red flag). No ratio is recomputed; each is exactly FDIC's published Call-Report figure. HONESTY: totalAvailable is the EXACT meta.total (stable across offset); the ONLY honest empty is meta.total:0/data:[] ⇒ complete:true/total:0, every other envelope (400 errors[]/404/non-JSON/missing meta or data) THROWS (never a fake empty); the snapshot build time is disclosed. NOTE: reported regulatory metrics, NOT a soundness rating or failure prediction; FDIC keys on CERT, not SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
certYesREQUIRED FDIC certificate number of the institution (→ CERT filter). From fdic_search_institutions.
limitNoRows per page, 1..1000, default 100.
offsetNo0-based row offset for pagination, 0..100000, default 0.
sortByNoSort field (allowlisted enum; default REPDTE = report date). An unknown field is rejected before fetch.
sortOrderNoSort direction, default DESC (newest quarter first).
reportDateNoOptional report date (→ REPDTE filter), a quarter-end as a YYYYMMDD integer (e.g. 20240630). Omit for the full quarterly ratio time-series.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and openWorldHint. Description extends with units (percent vs dollars, scaling), null handling (null vs 0, CBLR mapping), response structure, error behavior (throws on non-standard responses), and disclosure of no recomputation. No contradiction with 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?

Despite length, every sentence earns its place. Structured logically: purpose, parameters, units, nulls, CBLR, honesty, disclaimer. Front-loaded with main purpose. No redundant information.

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 tool with 6 parameters, no output schema, but high schema coverage, the description is exceptionally complete. It explains response structure (ratios array with fields), error handling, units, null behavior, and relationship to sibling tools. No gaps.

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

Parameters5/5

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

Schema coverage is 100%, but description adds significant value: explains cert's relation to fdic_search_institutions, reportDate format and effect, sortBy enum meaning and default, sortOrder default, limit/offset constraints. Every parameter is enriched beyond schema 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 it retrieves FDIC counterparty risk ratios for one institution by certificate number, using specific verbs (get, express) and resource (risk ratios). It distinguishes itself from sibling balance-sheet tools by calling itself the 'soundness lane' they cannot express.

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

Usage Guidelines5/5

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

Explicitly says to use this tool for risk ratios and contrasts with balance-sheet tools. Provides prerequisite: input cert from fdic_search_institutions. Also notes it is not a soundness rating or failure prediction, guiding appropriate use.

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

fdic_search_institutionsA
Read-only

Search the FDIC-insured-institution directory (keyless FDIC BankFind, api.fdic.gov/banks/institutions) — a regulated-entity directory for B2G counterparty / bank due-diligence. Structured filters: state (2-letter, → STALP), activeOnly (→ ACTIVE 1/0), cert (→ CERT, the STABLE entity key), plus name/city matched via FDIC's case-insensitive full-text search param (NOT filtersfilters=NAME:"chase" is case-sensitive exact-keyword and returns a false-empty; search=NAME:chase finds JPMorgan Chase etc.). limit (≤1000, def 100), offset (≤100000), sortBy (allowlisted enum NAME/CERT/ASSET/ESTYMD/STALP/CITY/ACTIVE), sortOrder (ASC/DESC). Returns { institutions:[{ name, city, state, cert, assetUSD, active, establishedDate, id }] }. HONESTY: totalAvailable is the EXACT meta.total (stable across offset — never the page length); ASSET is published in $thousands and normalized to whole USD ×1000 (null-never-0 — a real 0 stays 0, absent → null); the ONLY honest empty is meta.total:0/data:[] ⇒ complete:true/total:0, every other envelope (400 errors[]/404/non-JSON/missing meta or data) THROWS (never a fake empty); a multi-word name/city is matched per-token (disclosed); the point-in-time snapshot build time is disclosed. NOTE: FDIC keys on CERT, not SAM UEI/DUNS.

ParametersJSON Schema
NameRequiredDescriptionDefault
certNoFilter by FDIC certificate number (the STABLE entity key; → CERT filter).
cityNoFilter by CITY via FDIC full-text `search` (case-insensitive token match).
nameNoFilter by institution NAME via FDIC full-text `search` (case-insensitive token match; NOT case-sensitive exact-keyword — that is why we route to `search`, not `filters`).
limitNoRows per page, 1..1000, default 100.
stateNoFilter by 2-letter US state code (uppercase; → STALP filter). e.g. 'VA'.
offsetNo0-based row offset for pagination, 0..100000, default 0.
sortByNoOptional sort field (an allowlisted enum; an unknown field is rejected before fetch).
sortOrderNoSort direction when sortBy is set, ASC (default) or DESC.
activeOnlyNoFilter to active (true → ACTIVE:1) or inactive (false → ACTIVE:0) institutions; omit for both.

TDQS

A4.2/5.0
Behavior5/5

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

Extensive disclosure beyond annotations: explains exact behavior of totalAvailable, ASSET normalization (null vs 0), error handling (throws, not fake empties), multi-word token matching, and point-in-time snapshot. No contradiction with readOnlyHint/openWorldHint.

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?

Description is informative but lengthy and dense, with a single-paragraph structure that may overwhelm. The 'HONESTY' section adds value but reduces conciseness. Could be more structured with bullet points.

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?

Given 9 parameters, no output schema, and only readOnlyHint/openWorldHint annotations, the description is remarkably complete: covers return format, pagination, null handling, error behavior, and even the underlying API's key scheme (CERT). Leaves no major gaps.

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

Parameters5/5

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

Schema coverage is 100%, but description adds critical nuance: distinguishes case-sensitive 'filters' from full-text 'search' for name/city, explains sortBy is allowlisted and rejected before fetch, and specifies default/limits for limit/offset. Adds significant value beyond schema.

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

Purpose4/5

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

The description clearly states the tool searches the FDIC-insured institution directory for due diligence, using specific verb and resource. It does not explicitly differentiate from sibling FDIC tools like financials or failures, but the context implies a directory search.

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

Usage Guidelines3/5

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

Provides detailed how-to (case-sensitive vs full-text, pagination) but does not explicitly specify when to use this vs alternatives. Implicitly positioned for bank due-diligence but lacks direct comparison to siblings.

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

fed_register_get_documentA
Read-only

Fetch full detail for a Federal Register document by number. Returns title, abstract, citation, publication_date, effective_on, raw_text_url (for the full body), CFR references — everything needed to ground a regulation citation.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentNumberYesFederal Register document number, e.g. '2026-08333'

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true, indicating safe read-only behavior. The description adds value by listing specific fields returned (title, abstract, citation, etc.) and noting the raw_text_url for the full body, which helps the agent understand the output without needing an output schema.

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

Conciseness5/5

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

The description is a single sentence that efficiently conveys the purpose and key return fields, with no unnecessary words. It is front-loaded with the action.

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

Completeness4/5

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

Given the simplicity of the tool (one parameter, read-only), the description adequately covers the key return fields and the availability of raw text via raw_text_url. No output schema exists, but the listed fields provide sufficient context for an agent to use the tool.

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

Parameters3/5

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

Schema description coverage is 100% (the one parameter 'documentNumber' is described with an example). The description does not add any additional meaning beyond the schema's description of the parameter.

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 'Fetch full detail for a Federal Register document by number', using a specific verb ('Fetch') and resource ('document'). It distinguishes from siblings like 'fed_register_search_documents' which lists documents, and 'fed_register_public_inspection' which shows pending documents.

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 implies when to use (when full details of a specific document are needed) by listing the return fields. However, it does not explicitly state when not to use it or mention alternatives like 'fed_register_search_documents' for searching.

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

fed_register_list_agenciesA
Read-only

List all Federal Register agencies with slugs (needed for fed_register_search_documents). Use to resolve 'what's the FedReg slug for Veterans Affairs?'

ParametersJSON Schema
NameRequiredDescriptionDefault
perPageNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already provide readOnlyHint and openWorldHint, so safety and dynamic data are covered. The description adds that it lists 'all' agencies and that slugs are needed for another tool. It does not discuss pagination or the perPage parameter, but overall adds moderate value beyond 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 two sentences, front-loaded with the core purpose, and includes a concrete example. Every word earns its place.

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?

The description covers the main purpose and linkage to another tool, but lacks detail on the output format and the perPage parameter. Given no output schema, the agent might need more info about what is returned.

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 coverage is 0% (no descriptions in schema). The description does not mention the only parameter 'perPage', leaving its purpose and usage unexplained. For a single optional parameter, the description should clarify its effect.

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 it lists Federal Register agencies with slugs, specifies the verb 'List', the resource 'agencies', and the output 'slugs'. It explicitly distinguishes from siblings like fed_register_search_documents by stating slugs are needed for that tool.

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

Usage Guidelines4/5

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

The description provides good usage guidance: it tells when to use (to get slugs for fed_register_search_documents) and gives an example query. However, it does not explicitly mention when not to use or list alternative tools.

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

fed_register_public_inspectionA
Read-only

Federal Register PUBLIC INSPECTION desk — documents FILED with the Office of the Federal Register but NOT YET published (a pre-publication LEADING INDICATOR, ~1-to-several days ahead of the official publication_date). mode: 'current' (all on inspection now), 'date' (a specific available_on day), 'search' (full-text over the on-inspection set). Returns per-doc leadDays (pre-publication head-start), filing_type special-vs-regular, and unflattened agencies. NOTE: a public-inspection doc is NOT the authoritative published rule (no FR citation/page yet; may change or be withdrawn) — after publication_date cross-check fed_register_get_document.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD; REQUIRED iff mode='date'. Rides conditions[available_on] as a query param (never a path segment). Validated (real calendar date, 1994..currentYear+1) before any fetch.
modeNoRetrieval surface (default current): 'current' = all documents on public inspection now; 'date' = a specific inspection day (requires `date`); 'search' = server-side full-text over the on-inspection set (via `term`).
termNoFull-text query; VALID only in mode='search'. Rides conditions[term] (server-side).
typeNoClient-side document-type filter (applied in all modes).
limitNoPage size (default 20).
agencyNoClient-side agency-slug filter; matches ANY of a doc's agencies[].slug. Resolve slugs via fed_register_list_agencies.
offsetNoPage offset (default 0).
specialOnlyNoClient-side filter keeping only filing_type='special' (off-cycle/emergency — a stronger, sooner signal).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint and openWorldHint. The description adds critical behavioral context: docs are pre-publication, no FR citation/page, may change/withdraw, returns leadDays and filing_type (special vs regular). No contradiction with 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?

Concisely front-loads the core concept (leading indicator, ~1-to-several days ahead). Each sentence serves a purpose: mode explanation, return fields, limitations, cross-references. No wasted words.

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

Completeness5/5

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

No output schema, but description explains key return fields (leadDays, filing_type, agencies). It covers prerequisites (agency slugs via fed_register_list_agencies) and cautions on authoritative status. Complete for the tool's complexity and sibling context.

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

Parameters4/5

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

Schema coverage is 100% so baseline is 3. The description adds significant meaning: explains modes in depth, conditionality of date, notes that date rides conditions[available_on], and describes specialOnly filter as a stronger signal. This goes beyond schema 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 accesses Federal Register Public Inspection documents (filed but not yet published), a pre-publication leading indicator. It distinguishes three modes (current, date, search) and contrasts with the authoritative fed_register_get_document, ensuring the agent understands its unique role.

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

Usage Guidelines5/5

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

Explicitly explains when to use the tool (for early signals before official publication) and when not to (do not treat as authoritative; may change/withdraw). Recommends cross-checking with fed_register_get_document after publication and references fed_register_list_agencies for agency-slug resolution.

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

fed_register_search_documentsA
Read-only

Search Federal Register documents (proposed rules, final rules, notices, presidential documents) by query / agency / type / date range. Use for regulatory-context queries ('what new VA cybersecurity rules came out this quarter?').

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoDocument type
queryNo
perPageNo
agencySlugsNoFederal Register agency slugs, e.g. ['veterans-affairs-department']. Use fed_register_list_agencies to resolve.
effectiveDateFromNoYYYY-MM-DD
publicationDateToNoYYYY-MM-DD
publicationDateFromNoYYYY-MM-DD

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, indicating a safe read operation. The description adds context about document types and filters but does not elaborate on behavioral traits such as pagination, rate limits, or the nature of results (e.g., summary vs. full text). Since annotations cover the safety profile, the description adds moderate value.

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 concise, consisting of two sentences with no redundant information. It front-loads the core action and resource, then provides a usage example. Every sentence adds value, and the structure is efficient.

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?

The description covers the essential functionality and provides a concrete use case. Although there is no output schema, the openWorldHint annotation suggests the tool returns results in a standard format. The description does not explain pagination or result details, but for a search tool with 7 parameters, it provides sufficient context for an agent to understand when and how to invoke it.

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 71% (5 of 7 parameters have descriptions). The description reiterates the filter parameters (query, agency, type, date range) but does not add new semantic meaning beyond the schema. The 'perPage' parameter lacks a schema description and is not mentioned in the tool description. With high coverage, baseline 3 is appropriate.

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 explicitly states the tool's action ('Search Federal Register documents') and specifies the resource types ('proposed rules, final rules, notices, presidential documents'). It lists key filtering criteria (query, agency, type, date range) and provides a concrete example. This clearly distinguishes it from sibling tools, which cover other registries or data sources.

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 includes a clear usage context ('Use for regulatory-context queries') and a specific example ('what new VA cybersecurity rules came out this quarter?'). While it does not explicitly mention when not to use the tool, the provided guidance is sufficient for an agent to select this tool over siblings like 'ecfr_search' or 'regulations_search_documents'.

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

feedbackA
Read-only

Report a problem, request a feature, or flag a wrong-looking result for THIS server — returns a PREFILLED GitHub issue link (public repo cliwant/mcp-sam-gov) for the USER to open and submit. KEYLESS. The server does NOT post anything: it only builds the link; the human submits it (nothing is sent automatically, no network call). Use when the user reports a bug, says a tool's output looks wrong, or wants a capability this server doesn't have. Input (all optional): kind (bug|feature|wrong_output, default bug), tool (the tool it's about), summary (a short, NON-SENSITIVE title line). Returns { reportUrl, repo, willPost:false, instructions, privacy }. PRIVACY: never put secrets, personal data, or sensitive query values in summary — the issue is PUBLIC and the link prefills only your summary + tool + server version.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhat kind of report: bug (default), feature (a capability this server lacks), or wrong_output (a tool returned a wrong/suspicious result).
toolNoThe tool name this is about, if any (e.g. 'sam_search_opportunities').
summaryNoA short one-line summary for the issue title/body. PUBLIC — never include API keys, personal data, or sensitive query values.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations include readOnlyHint=true, consistent with description stating 'The server does NOT post anything: it only builds the link; the human submits it.' Description adds critical behavioral details beyond annotations, including privacy warnings and no network call.

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?

Description is front-loaded with purpose and mechanism, then lists inputs and output. Slightly lengthy but all sentences earn their place. Could be trimmed slightly but remains effective.

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

Completeness5/5

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

For a simple 3-param tool with no output schema, the description is exhaustive. It explains return fields, behavior (no automatic posting), privacy, and instructions. No gaps.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. Description adds value by clarifying defaults (kind default bug), providing examples, and emphasizing privacy concerns for summary. This extra guidance improves usability.

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 defines the tool's purpose: 'Report a problem, request a feature, or flag a wrong-looking result for THIS server'. It uses specific verbs and resources, and is distinct from all sibling data-retrieval tools.

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?

Provides explicit usage contexts: 'Use when the user reports a bug, says a tool's output looks wrong, or wants a capability this server doesn't have.' Does not explicitly state when not to use or mention alternatives, but context is clear.

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

fema_disaster_declarationsA
Read-only

Look up FEMA disaster / emergency declarations by state, type, incident, year, or date (keyless OpenFEMA, dataset DisasterDeclarationsSummaries v2, ~70k rows). Structured filters (module-built into an OData $filter; each LIVE-VERIFIED to narrow): state (→ state), incidentType (e.g. 'Flood'), declarationType (DR/EM/FM), fyDeclared, disasterNumber, declaredDateFrom/declaredDateTo (declarationDate ge/le), paProgramDeclared/iaProgramDeclared (booleans). limit (≤1000, def 100 → $top), offset (→ $skip). HONESTY: the module ALWAYS sends $inlinecount=allpages so totalAvailable is the EXACT filtered total (metadata.count), never the page length; genuine-empty ⇒ complete:true/total:0; an outage/400/404 THROWS (never a fake empty). NOTE: per-dataset OData field names differ — 'state' here is the real field, whereas the public-assistance tool maps 'state' to 'stateAbbreviation'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows per page ($top), 1..1000, default 100.
stateNoFilter by state (→ state eq 'XX'). 2-letter code.
offsetNo0-based row offset ($skip) for pagination, default 0.
fyDeclaredNoFilter by fiscal year declared (→ fyDeclared eq N). e.g. 2024.
incidentTypeNoFilter by incident type (→ incidentType eq '...'). e.g. 'Flood', 'Hurricane', 'Winter Storm'.
declaredDateToNoLatest declaration date, inclusive (→ declarationDate le 'ISO').
disasterNumberNoFilter by FEMA disaster number (→ disasterNumber eq N).
declarationTypeNoFilter by declaration type (→ declarationType eq 'XX'): DR (major disaster), EM (emergency), FM (fire management).
declaredDateFromNoEarliest declaration date, inclusive (→ declarationDate ge 'ISO').
iaProgramDeclaredNoFilter to declarations where the Individual Assistance program was declared (→ iaProgramDeclared eq true/false).
paProgramDeclaredNoFilter to declarations where the Public Assistance program was declared (→ paProgramDeclared eq true/false).

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description details the OData query mechanics (always sends $inlinecount=allpages), the meaning of totalAvailable, and genuine empty vs. error handling. It also explains how filters are built and verified.

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 detailed but well-organized, with sections for filters, pagination, honesty notes, and field-name caveats. It is longer than ideal, but every sentence adds value.

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?

Given 11 parameters, no required fields, and no output schema, the description covers the data source, filter construction, pagination, error handling, and field name nuances. It is comprehensive for an API tool.

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

Parameters4/5

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

With 100% schema coverage, baseline is 3. The description adds value by explaining the OData filter syntax for each parameter, noting the real field names, and comparing to other tools. It clarifies the meaning of date parameters and boolean filters.

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 looks up FEMA disaster/emergency declarations by various filters such as state, type, incident, year, or date. It distinguishes itself from sibling tools like fema_search_public_assistance by noting field name differences, and from fema_search_hazard_mitigation by focusing on declarations.

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

Usage Guidelines4/5

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

The description provides context by noting that the state field matches the real field in the dataset, contrasting with other tools. It also mentions the dataset size and filter construction, but does not explicitly state when to use this tool over alternatives.

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

fema_search_hazard_mitigationA
Read-only

Search FEMA Hazard Mitigation Assistance projects — the disaster-RESILIENCE grant axis (HMGP/FMA/PDM/BRIC mitigation grants to state/local/tribal subrecipients, distinct from the disaster-RECOVERY spend in fema_search_public_assistance). Keyless OpenFEMA, dataset HazardMitigationAssistanceProjects v4, ~56k rows. Structured filters (module-built into an OData $filter; each LIVE-VERIFIED to narrow): state (→ state — the FULL state NAME, e.g. 'Alabama', NOT the 2-letter code), programArea (HMGP/FMA/PDM/BRIC/LPDM/FMA-SL), disasterNumber, status (e.g. 'Closed'), programFy, region (FEMA region 1–10), minProjectAmount/maxProjectAmount (projectAmount ge/le). limit (≤1000, def 100 → $top), offset (→ $skip). HONESTY: the module ALWAYS sends $inlinecount=allpages so totalAvailable is the EXACT filtered total (metadata.count), never the page length; amount fields (projectAmount/federalShareObligated/initialObligationAmount/netValueBenefits) are number|null (a real 0 stays 0, absent → null); genuine-empty ⇒ complete:true/total:0; an outage/400/404 THROWS (never a fake empty). NOTE: 'state' here is the full name (this dataset 400s on a 2-letter code), whereas fema_search_public_assistance maps 'state' to the 2-letter 'stateAbbreviation'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows per page ($top), 1..1000, default 100.
stateNoFilter by state (→ state eq '...'). Accepts EITHER a 2-letter code ('AL', like the other FEMA tools) OR the full name ('Alabama'); the module maps a 2-letter code to the full name this dataset requires.
offsetNo0-based row offset ($skip) for pagination, default 0.
regionNoFilter by FEMA region number 1–10 (→ region eq N).
statusNoFilter by project status (→ status eq '...'). e.g. 'Closed', 'Open'.
programFyNoFilter by program fiscal year (→ programFy eq N). e.g. 2005.
programAreaNoFilter by mitigation program (→ programArea eq '...'): HMGP (Hazard Mitigation Grant Program), FMA (Flood Mitigation Assistance), PDM (Pre-Disaster Mitigation), BRIC (Building Resilient Infrastructure and Communities), LPDM, FMA-SL.
disasterNumberNoFilter by FEMA disaster number (→ disasterNumber eq N).
maxProjectAmountNoMaximum project amount (→ projectAmount le N).
minProjectAmountNoMinimum project amount (→ projectAmount ge N).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint. Description adds honest details about $inlinecount behavior, null handling, and error throwing, which are beyond annotations.

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?

Well-structured with purpose, parameter details, and honesty section. Front-loaded but slightly verbose in spots; still efficient for the information provided.

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?

Covers all necessary aspects: pagination, filtering, error handling, output expectations. No output schema but description compensates fully.

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

Parameters3/5

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

Schema coverage is 100%, baseline 3. Description adds disambiguation for state vs sibling but introduces contradiction: says 'NOT the 2-letter code' while schema says it accepts both and maps. Slightly confusing.

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

Purpose5/5

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

Clearly states verb 'Search', resource 'FEMA Hazard Mitigation Assistance projects', and explicitly distinguishes from sibling tool fema_search_public_assistance for disaster-recovery spend.

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

Usage Guidelines5/5

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

Explicitly says when to use for disaster-resilience grants (HMGP/FMA/PDM/BRIC) and contrasts with recovery-focused sibling. Also notes state parameter difference from sibling.

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

fema_search_public_assistanceA
Read-only

Search FEMA Public Assistance funded projects — federal emergency-assistance spend to state/local/tribal applicants (keyless OpenFEMA, dataset PublicAssistanceFundedProjectsDetails v2, ~800k rows). Structured filters (module-built into an OData $filter; each LIVE-VERIFIED to narrow): state (→ stateAbbreviation), disasterNumber, applicantId, damageCategoryCode (e.g. 'B' = Emergency Protective Measures), incidentType, minProjectAmount/maxProjectAmount (projectAmount ge/le), declaredDateFrom/declaredDateTo (declarationDate ge/le). limit (≤1000, def 100 → $top), offset (→ $skip). HONESTY: the module ALWAYS sends $inlinecount=allpages so totalAvailable is the EXACT filtered total (metadata.count), never the page length; amount fields are number|null (a real 0 stays 0, absent → null); genuine-empty ⇒ complete:true/total:0; an outage/400/404 THROWS (never a fake empty).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows per page ($top), 1..1000, default 100.
stateNoFilter by applicant state (→ stateAbbreviation eq 'XX'). 2-letter code.
offsetNo0-based row offset ($skip) for pagination, default 0.
applicantIdNoFilter by applicant id (→ applicantId eq '...'). e.g. '015-UF5E0-00'.
incidentTypeNoFilter by incident type (→ incidentType eq '...'). e.g. 'Flood', 'Hurricane', 'Severe Storm'.
declaredDateToNoLatest declaration date, inclusive (→ declarationDate le 'ISO').
disasterNumberNoFilter by FEMA disaster number (→ disasterNumber eq N).
declaredDateFromNoEarliest declaration date, inclusive (→ declarationDate ge 'ISO').
maxProjectAmountNoMaximum project amount (→ projectAmount le N).
minProjectAmountNoMinimum project amount (→ projectAmount ge N).
damageCategoryCodeNoFilter by PA damage category code (→ damageCategoryCode eq 'X'). e.g. 'B' = Emergency Protective Measures, 'C'–'G' = permanent work.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond annotations by disclosing inlinecount behavior, exact total count, null handling, empty response format, and error throwing. It also notes filters are 'LIVE-VERIFIED', adding reliability context.

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 dense but well-structured with a clear logical flow: purpose, filters, honesty notes. Some redundancy could be trimmed, but every sentence adds value.

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?

Given the complexity (11 parameters, no output schema), the description covers behavioral details, edge cases, authenticity, and error handling. It provides enough context for effective use without an output schema.

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

Parameters5/5

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

Even though schema coverage is 100%, the description adds significant meaning: mapping filters to OData fields, providing example values, explaining limit/offset in API terms, and indicating filters are module-built. This enriches understanding beyond the schema.

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

Purpose5/5

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

The description clearly states the tool searches FEMA Public Assistance funded projects, specifies the exact dataset and version, and distinguishes it from sibling tools like fema_disaster_declarations.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool (searching PA projects) and details the structured filters. It implies alternatives exist (e.g., disaster declarations) but doesn't explicitly state when not to use it.

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

fpds_search_awardsA
Read-only

Search FPDS-NG federal contract AWARD ACTIONS (keyless ATOM) — the AUTHORITATIVE system-of-record for contract actions (each modification is its own transaction), the source USAspending.gov derives from (and lags 1-2 days). Structured filters ONLY, AND-combined (NO raw query — a typo'd FPDS field name is a SILENT ZERO, so the tool builds the fielded q): naics (PRINCIPAL_NAICS_CODE), vendorName, piid, departmentId, contractingAgencyName, signedDate range (from/to ISO), lastModified range, keyword. At least one filter is REQUIRED. Returns award/IDV rows { piid, modNumber, parentIdvPiid, actionType, signedDate, vendorName, vendorUei, ultimateParentUei, obligatedAmount, totalObligatedAmount, naics, psc, placeOfPerformanceState, extentCompeted, setAside, businessSize, socioeconomic, … } (content root is award OR IDV — both parse). HONESTY: page size is FIXED at 10; for >10 results totalAvailable is a LOWER BOUND (totalIsLowerBound:true; true count ∈ [total, total+9]) and you MUST paginate by pagination.hasMore (page-fullness), NEVER by totalAvailable (keyless deep-paging is capped ~200K far below the advertised total). Genuine-empty (offset 0) ⇒ complete:true/total:0 + a silent-zero disclosure; an empty page at offset>0 ⇒ totalAvailable:null/complete:false (deep-paging ceiling, ambiguous); an HTML/non-feed body or an all-null-piid page ⇒ schema_drift (never a fake empty); an outage/5xx/timeout THROWS. Amounts are number|null (a 0.00 obligation and negative de-obligations are REAL, absent ⇒ null). Prefer usas_* tools for spending rollups / sub-award graphs.

ParametersJSON Schema
NameRequiredDescriptionDefault
piidNoContract/order PIID (→ PIID) — returns that action's full base+mod chain.
naicsNoPrincipal NAICS code (→ PRINCIPAL_NAICS_CODE), e.g. '541511'.
offsetNo0-indexed page start (page size fixed at 10). Keyless deep-paging past ~200K is unreliable.
keywordNoFree-text keyword (bare full-text term; FPDS FIELD: operators are stripped for safety).
vendorNameNoVendor/contractor name phrase (→ VENDOR_NAME), e.g. 'LOCKHEED MARTIN'.
departmentIdNo4-digit contracting DEPARTMENT_ID, e.g. '9700' (DoD), '4700' (GSA).
signedDateToNoSigned-date range END (ISO YYYY-MM-DD); pair with signedDateFrom.
lastModifiedToNoLast-modified range END (ISO YYYY-MM-DD); pair with lastModifiedFrom.
signedDateFromNoSigned-date range START (ISO YYYY-MM-DD); pair with signedDateTo (→ SIGNED_DATE:[from,to]).
lastModifiedFromNoLast-modified range START (ISO YYYY-MM-DD); pair with lastModifiedTo (→ LAST_MOD_DATE:[from,to]).
contractingAgencyNameNoContracting agency name phrase (→ CONTRACTING_AGENCY_NAME), e.g. 'DEPT OF DEFENSE'.

TDQS

A4.8/5.0
Behavior5/5

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

Despite annotations already providing readOnlyHint and openWorldHint, the description adds extensive behavioral details: fixed page size of 10, totalAvailable is a lower bound, deep-paging cap at ~200K, handling of genuine-empty vs ambiguous-empty pages, schema_drift detection, outage/error behavior, and amount representation. No contradiction with annotations.

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 long but every sentence adds necessary information. It is front-loaded with the core purpose and authority, then filters, then output, then honesty section. No wasted words, though length could be slightly optimized for skimming.

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?

With no output schema, the description fully describes the return fields and content root (award or IDV). It covers edge cases, pagination guidance, and error handling. Given the tool's complexity and lack of output schema, the description is thorough and complete.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. However, the tool description adds significant context beyond the schema, such as how filters are combined (AND), the unreliability of offset beyond ~200K, and the meaning of PIID returning full base+mod chain. This added value justifies a score of 4.

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 specifies it searches FPDS-NG federal contract award actions, the authoritative system-of-record, and distinguishes itself from sibling tools like usas_* by stating it is the source for USAspending. It uses specific verbs and resources.

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

Usage Guidelines5/5

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

Explicitly states when to use structured filters only (NO raw query), requires at least one filter, explains AND-combined behavior, and advises preferring usas_* tools for rollups or sub-award graphs. Also includes pagination and deep-paging limitations.

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

fred_search_seriesA
Read-only

Discover FRED economic series (GDP, CPI, interest rates, unemployment, PPI…) by free-text search (FRED /fred/series/search; api.stlouisfed.org). ★REQUIRES a free FRED_API_KEY: FRED has NO keyless tier, so without the key this tool THROWS an honest config error (get one at https://fred.stlouisfed.org/docs/api/api_key.html; fred_series_observations shares this key — call api_key_status to see every source's key requirement). Input: query (the search_text, required, e.g. 'unemployment rate' / 'CPI' / '10-year treasury'), optional limit (default 25, max 1000), offset. Returns { series:[{ id, title, frequency, frequencyShort, units, seasonalAdjustment, observationStart, observationEnd, lastUpdated, popularity }] } + honest _meta. Feed id into fred_series_observations for the time series. HONESTY: totalAvailable is FRED's EXACT reported count (offset pagination via hasMore/nextOffset — never fabricated); every scalar is null-never-empty-string; a genuine no-match ⇒ honest empty (returned:0); a 400 (bad/missing key) ⇒ invalid_input CARRYING FRED's error_message; a 5xx ⇒ THROWS; a 200 non-JSON / non-array seriess ⇒ schema_drift. The key rides ONLY in the &api_key= query param — never logged or echoed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax series to return (default 25, max 1000). Offset-paginated.
queryYesThe FRED search_text — free-text terms to discover economic series, e.g. 'unemployment rate', 'CPI', 'GDP', '10-year treasury'. Required.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.

TDQS

A4.6/5.0
Behavior5/5

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

The description extensively discloses behaviors: key requirement, error types (400, 5xx, 200 non-JSON), pagination details, null handling, honest empty results, and key security (only in query param, not logged). This goes far beyond the readOnlyHint and openWorldHint annotations.

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 fairly long but front-loaded with the core purpose. Every sentence adds value, though some repetition (e.g., 'honest' multiple times). Structure is logical and informative.

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?

Despite lacking an output schema, the description fully documents return structure ({ series: [...] } + _meta), error conditions, pagination, and next steps. It is comprehensive for a search tool with complex API behavior.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds meaningful context: defaults (25, 1000 max, offset 0), pagination with nextOffset, and example query values. This enhances the parameter understanding beyond the schema.

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

Purpose5/5

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

The description clearly states it discovers FRED economic series by free-text search, listing examples like GDP, CPI, etc., and explicitly references the companion tool fred_series_observations, distinguishing it from siblings.

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 explicitly requires a FRED_API_KEY, explains the consequence of missing it, and guides users to api_key_status for key requirements. It provides input examples and output usage (feed id to fred_series_observations). However, it does not explicitly exclude alternative tools or usage scenarios.

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

fred_series_observationsA
Read-only

Fetch a FRED series' time series of date/value observations (FRED /fred/series/observations; api.stlouisfed.org). ★REQUIRES a free FRED_API_KEY (FRED has NO keyless tier — without it this tool THROWS an honest config error; get one at https://fred.stlouisfed.org/docs/api/api_key.html). Input: seriesId (required, e.g. 'GDP', 'CPIAUCSL', 'UNRATE', 'DGS10', 'PPIACO'; discover with fred_search_series), optional startDate/endDate (YYYY-MM-DD), limit (default 100, max 100000), offset, sortOrder (asc|desc). Returns { observations:[{ date, value }] } + honest meta. ★MISSING-VALUE HONESTY (the crux): FRED encodes a missing observation as the literal '.', which maps to value:null (missing) — NEVER 0; a genuine reported 0 is preserved as 0. HONESTY: totalAvailable is FRED's EXACT count (offset pagination via hasMore/nextOffset — never fabricated); a 400 (bad seriesId / missing key) ⇒ invalid_input CARRYING FRED's error_message (never a fake empty); a genuine empty ⇒ honest empty; a 5xx ⇒ THROWS; a 200 non-JSON / non-array observations ⇒ schema_drift. seriesId is charclass-validated (^[A-Za-z0-9.-]+$) and dates are YYYY-MM-DD; the key rides ONLY in the &api_key= query param.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax observations to return (default 100, max 100000). Offset-paginated.
offsetNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
endDateNoLatest observation date (YYYY-MM-DD). Maps to FRED observation_end.
seriesIdYesA FRED series id, e.g. 'GDP', 'CPIAUCSL' (CPI), 'UNRATE' (unemployment), 'DGS10' (10-yr Treasury), 'PPIACO' (PPI). Discover ids with fred_search_series. Validated ^[A-Za-z0-9._-]+$. Required.
sortOrderNoObservation date order: 'asc' (oldest first, FRED default) or 'desc' (newest first).
startDateNoEarliest observation date (YYYY-MM-DD). Maps to FRED observation_start.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=true. The description adds crucial behavioral details: missing values map to null not 0, error handling specifics (400 returns invalid_input with FRED message), pagination via hasMore/nextOffset, validation rules, and key placement. No contradiction with annotations.

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?

Well-organized with bold emphasis and bullet points for key sections. Front-loads core action and prerequisites. Slightly verbose but every sentence adds value; could be tightened slightly.

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?

Given 6 parameters, no output schema, and complex behavior (pagination, error handling, missing values), the description covers return format ({observations}), pagination metadata, error scenarios, and validation. Fully compensates for missing output schema.

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

Parameters5/5

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

Schema coverage is 100%, and the description enriches each parameter with examples (seriesId: 'GDP', 'CPIAUCSL'), default values (limit 100, max 100000), validation patterns, and additional context (startDate/endDate map to FRED observation_start/end). Goes beyond schema.

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

Purpose5/5

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

The description clearly states the tool fetches FRED series observations with specific verb 'Fetch' and resource 'FRED series' time series. It provides examples of series IDs and distinguishes from fred_search_series for discovery.

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

Usage Guidelines4/5

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

Explicitly requires FRED_API_KEY with warning about no keyless tier, advises using fred_search_series for ID discovery, and lists optional parameters with defaults and constraints. Does not explicitly state when not to use, but context makes it clear this is the only FRED data-fetching tool among siblings.

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

gao_protest_lookupA
Read-only

Recent GAO (Comptroller General) bid-protest decisions from the public Legal-Products RSS feed, enriched from each decision page (protester, contracting agency, decision date, outcome sustained/denied/dismissed/withdrawn, solicitation #, decision PDF). Filter client-side by agency/protester/solicitation/outcome, or pull one decision directly by bNumber. HONEST SCOPE: keyless covers only the RECENT feed window (~25 items) — GAO's faceted historical protest search (all years, by protester/agency/outcome/date) is WAF-blocked to bots and available only via a paid third-party API, so results are ALWAYS marked complete:false and are NOT the full protest history (see the accessNote).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax decisions to return (default 20, max 50). The feed itself carries ~25 recent legal products.
agencyNoClient-side substring filter on the recent-protest feed (matched against the decision title + description). NOTE: filters the RECENT feed window only — not a historical agency search.
enrichNoFetch each decision's page to fill agency/outcome/solicitation/PDF (default true). Set false for a fast feed-only list (those fields will be null).
bNumberNoFetch ONE specific decision directly by GAO B-number (e.g. 'B-424377' or 'b-424249.2'), bypassing the feed. Use to pull a decision that has aged out of the recent feed window.
outcomeNoFilter by protest disposition (default 'any'). Determined from each decision page, so it applies only when enrich is true.
protesterNoClient-side substring filter on the protester name (feed title/description).
solicitationNumberNoClient-side substring filter on the solicitation number (matched in the feed description).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=true. The description adds crucial context: the feed covers only ~25 items, results are incomplete (complete:false), and historical search requires a paid API. No contradictions.

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 fairly concise given the complexity, with key info front-loaded. It includes an 'HONEST SCOPE' section that clearly states limitations without being verbose. Minor redundancy but overall efficient.

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?

Despite no output schema, the description covers usage, filtering, enrichment, and limitations. It explains the fields returned (protester, agency, outcome, etc.) and when to expect nulls. Sufficient for effective tool selection.

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?

With 100% schema coverage, the baseline is 3. The description adds value beyond schema by explaining the limit's relation to feed size, the agency filter's scope, and bNumber's purpose to bypass the feed for aged-out decisions.

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

Purpose5/5

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

The description clearly states the tool retrieves 'Recent GAO (Comptroller General) bid-protest decisions' from a specific RSS feed, enriched with details. It differentiates from unrelated sibling tools by focusing on GAO protests, with no overlap.

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

Usage Guidelines5/5

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

The description explicitly notes when to use (recent feed) and when not (historical search is WAF-blocked). It advises using bNumber for aged-out decisions and clarifies that results are always marked complete:false, guiding the agent on appropriate scenarios.

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

govinfo_get_packageA
Read-only

Fetch ONE GovInfo package's summary (metadata + download links txt/xml/pdf/mods/premis/zip + related links) by packageId (api.data.gov keyed). Input packageId (from govinfo_search_packages, e.g. 'BILLS-118hr1enr', 'PLAW-117publ58', 'CFR-2023-title1-vol1'). Returns { found:true, packageId, package:{…} } + single-record _meta (complete:true). A nonexistent packageId ⇒ found:false (HTTP 404, never a fabricated summary). Any api_key embedded in a download link is stripped key-free before the payload is surfaced.

ParametersJSON Schema
NameRequiredDescriptionDefault
packageIdYesGovInfo packageId from govinfo_search_packages (e.g. 'BILLS-118hr1enr', 'PLAW-117publ58', 'CFR-2023-title1-vol1', 'GAOREPORTS-GAO-24-106221').

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint and openWorldHint. The description adds: response structure with found:true/false, package object, and meta; that a nonexistent packageId returns found:false with HTTP 404; and that API keys in download links are stripped. This provides full transparency beyond 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 concise (three sentences) and front-loaded with the core action. Every sentence adds information: what it does, how to use it, and important edge-case behavior. No wasted words.

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

Completeness5/5

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

For a simple fetch tool with one parameter and no output schema, the description is complete. It covers the response structure, error handling (404), and data cleaning (API key stripping). No further details are needed for correct invocation and understanding of results.

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

Parameters4/5

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

Schema coverage is 100% with a description for packageId. The tool description adds value by explaining the source of the ID (from govinfo_search_packages) and providing examples, which helps the agent understand the expected format. This goes beyond the schema's minimal description.

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 it fetches a single GovInfo package's summary with metadata and download links. It specifies the required packageId and gives concrete examples. It distinguishes itself from sibling tool govinfo_search_packages by indicating that its input comes from that search.

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 implies usage: after obtaining a packageId from govinfo_search_packages. It does not explicitly state when not to use it or mention alternatives, but for a fetch tool this is reasonably clear. The behavior on nonexistent ID (404) is explained.

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

govinfo_list_collectionsA
Read-only

List the GovInfo collection catalog (GPO-authoritative publications; api.data.gov keyed — DATA_GOV_API_KEY or the shared DEMO_KEY). No input. Returns { collections:[{ collectionCode, collectionName, packageCount, granuleCount }] } + _meta (complete:true, totalAvailable = collection count). The discovery entry-point: feed a collectionCode to govinfo_search_packages. Memoized ~6h; also the validator source for search_packages' collection arg. packageCount = whole packages; granuleCount = sub-package granules (a missing count is null, never 0).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

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

The description adds significant behavioral context beyond the 'readOnlyHint' and 'openWorldHint' annotations, including memoization (6h), details on count semantics (null vs 0 for granuleCount), and its role as validator source for search_packages. No contradictions with annotations.

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 concise and front-loads the purpose, output structure, and usage hints. It packs multiple pieces of information into a single paragraph without redundancy, though it could be slightly more structured for readability.

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?

Given the tool's simplicity (no params, no output schema), the description fully covers the output format, memoization, edge cases (null counts), and integration with sibling tools, making it complete for an AI agent to use correctly.

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?

With zero parameters and 100% schema coverage (empty schema), the description correctly adds no parameter details. The baseline for zero-param tools is 4, and the description focuses on output and usage, which is appropriate.

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 it lists the GovInfo collection catalog and distinguishes itself from sibling tools like 'govinfo_search_packages' by noting it is the discovery entry-point that provides collection codes for further searches.

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 explicitly states 'No input' and positions itself as the starting point for using 'govinfo_search_packages', providing clear usage context. However, it does not explicitly list conditions where it should not be used, though its simplicity makes this less necessary.

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

govinfo_search_packagesA
Read-only

Search GovInfo packages in a collection modified since a date (GPO-authoritative bulk publications; api.data.gov keyed). Input collection (uppercase code — validated against the live catalog; an unknown code ⇒ invalid_input listing valid codes, NEVER a misleading empty), startDate/endDate? (YYYY-MM-DD or ISO datetime; filters by lastModified — the record UPDATE date, NOT dateIssued — disclosed in _meta), pageSize? (1..1000, def 100), pageMark? (opaque cursor, def ''). Returns { collection, packages:[{ packageId, title, dateIssued, lastModified, docClass, congress, packageLink }] } + cursor _meta. HONESTY: totalAvailable = count (the EXACT real total, NOT the page size); GovInfo uses an OPAQUE cursor, so pagination.offset/nextOffset are null — continue by passing meta.nextCursor back as pageMark (hasMore:false / nextCursor:null = last page). The raw upstream nextPage URL is never surfaced (it embeds the key). Genuine-empty ⇒ complete:true/total:0; outage/4xx THROWS (never a fake empty). CFR/ECFR/FR collections carry a note routing to the ecfr/fed_register_* tools for point lookups.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoOptional upper bound on lastModified (same format as startDate).
pageMarkNoOpaque continuation cursor. Default "*" (first page). To page, pass back the previous response's _meta.nextCursor (NOT a numeric offset — GovInfo uses an opaque cursor).
pageSizeNoRows per page (upstream pageSize), 1..1000, default 100.
startDateYesLower bound on lastModified (the record's last-update date, NOT dateIssued), YYYY-MM-DD (normalized to T00:00:00Z) or a full ISO datetime. e.g. '2024-01-01'.
collectionYesGovInfo collection code (uppercase alpha), e.g. BILLS, PLAW, CREC, USCODE, CFR, FR, BUDGET, GAOREPORTS. Validated against the live /collections catalog — an unknown code returns invalid_input listing valid codes (never a misleading empty). Use govinfo_list_collections to discover codes.

TDQS

A4.9/5.0
Behavior5/5

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

Discloses read-only nature, real data (no fake empties), exact total count, opaque cursor, and upstream API behavior. Describes error handling and that nextPage URL is not surfaced. Goes well beyond annotations.

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 dense and informative, but slightly long. However, every sentence serves a purpose, and it is well-organized with clear sections (parameters, returns, notes). No fluff.

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

Completeness5/5

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

No output schema exists, but the description fully documents the return structure (collection, packages fields, _meta cursor). Covers empty results, errors, and alternative tool routing. Complete for a search tool.

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

Parameters5/5

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

Schema coverage is 100%, and the description adds critical context: collection validation against live catalog, date filter meaning (lastModified vs dateIssued), opaque cursor explanation, and pagination limits. Adds value beyond schema.

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

Purpose5/5

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

The description clearly states it searches GovInfo packages in a collection with a date filter. It distinguishes from siblings by mentioning govinfo_list_collections and routing to ecfr_*/fed_register_* for specific collections.

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

Usage Guidelines5/5

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

Extensive guidance on when to use, parameter usage, pagination mechanics, error behavior, and alternatives for CFR/ECFR/FR collections. Includes explicit notes on correct pagination and date semantics.

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

grants_get_opportunityA
Read-only

Fetch full detail for a single grant opportunity by id. Returns found:true with description, agency, posting/response/archive dates, award_ceiling, award_floor, estimated_funding, expected_number_of_awards, applicant_types, funding_instruments, CFDA programs. agency is { code, name (the REAL posting/sub-tier agency, e.g. 'Food and Nutrition Service'), department (the top-tier agency, e.g. 'Department of Agriculture'), contactName (the program officer — NOT the agency) } — Grants.gov's raw agencyName field is actually the contact person, so this tool sources the real agency from agencyDetails; name may be null if the record carries no structured agency. A NONEXISTENT id returns { found:false, opportunityId } — never a fabricated grant with empty fields (Grants.gov answers a bad id with a hollow 200, which this tool detects). Check found before reading the other fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
opportunityIdYesGrants.gov opportunity id (numeric string)

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the 'readOnlyHint' and 'openWorldHint' annotations, the description reveals critical behaviors: the structure of the 'agency' object (sourcing real agency from agencyDetails, not raw agencyName), the handling of nonexistent ids (returning found:false), and the fact that Grants.gov returns hollow 200s which the tool detects. No contradictions with annotations.

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 moderately lengthy but well-structured: core purpose first, then field list, then a detailed note about agency, then error behavior. Every sentence adds value, though minor redundancy could be trimmed.

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?

Given no output schema, the description thoroughly details return fields (including nested objects), edge cases (null agency name, nonexistent ids), and error handling. It provides complete context for an agent to use the tool correctly.

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 100% schema coverage and only one parameter, the schema already describes it as 'Grants.gov opportunity id (numeric string)'. The description adds no new parameter semantics beyond that, meeting the baseline of 3.

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 opens with 'Fetch full detail for a single grant opportunity by id', clearly stating the verb, resource, and scope. It distinguishes from sibling tools like 'grants_search' and 'sam_get_opportunity' by emphasizing the single-id detail retrieval.

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

Usage Guidelines4/5

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

The description provides clear context for when to use this tool (to get full detail by id) and explicitly explains the behavior for nonexistent ids ('never a fabricated grant'). While it does not list alternatives, the sibling list and the tool's specificity make usage clear.

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

gsa_benchmark_labor_ratesA
Read-only

GSA CALC awarded ceiling-rate market band for a labor category (keyless). Returns a DISTRIBUTION (currentRate min/median/max + escalated medians) over a fetched sample, NOT a single price. CALC rates are CEILING/catalog and FULLY BURDENED (do not re-add wrap); the match count SATURATES at 10000 for broad queries (totalAvailable null then). Filter by businessSize/educationLevel(code)/experience/sin to narrow.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinNoSchedule SIN filter (e.g. '54151S').
priceRangeNoCeiling-price range as 'min,max' (e.g. '50,150').
businessSizeNoBusiness size filter: 'S' (small) or 'O' (other-than-small).
laborCategoryYesLabor category to benchmark (e.g. 'Program Manager', 'Software Engineer'). Matched exactly against CALC's labor_category.
educationLevelNoEducation filter — use CALC's SHORT CODES (e.g. 'HS','AA','BA','MA','PHD'); the displayed education_level field may show full words.
maxSamplePagesNoHow many 20-row pages to sample for the distribution (default 3, max 10).
experienceRangeNoExperience range as 'min,max' (e.g. '5,10').
minYearsExperienceNoMinimum years of experience filter.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint and openWorldHint. The description adds critical behavioral details: returns distribution (min/median/max + escalated medians), match count saturation, and null totalAvailable for broad queries. No contradiction.

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 dense paragraph that front-loads purpose and then provides essential details. It is efficient but could be slightly more structured with bullet points for readability. Still, every sentence adds value.

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?

With no output schema, the description explains return distribution components (currentRate min/median/max + escalated medians). It covers key aspects like saturation and filtering, but could mention error states or define 'keyless' more clearly.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. The description adds semantic value by explaining education level uses short codes, business size filter meaning, and context like 'keyless' and saturation effect on results, raising the score above baseline.

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 verb 'benchmarks' and resource 'GSA CALC labor rates', specifying it returns a distribution not a single price. It distinguishes from any sibling by focusing on labor rates, a unique domain among the listed tools.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: rates are ceilling/catalog and fully burdened, warns against double-adding wrap, explains saturation at 10000 matches, and suggests filters to narrow queries. It covers both usage and limitations.

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

gsa_perdiem_ratesA
Read-only

Look up GSA Federal Travel PER-DIEM rates — the max lodging + Meals & Incidental Expenses (M&IE) reimbursement ceilings for official U.S. government travel (api.gsa.gov /travel/perdiem/v2, keyed — DATA_GOV_API_KEY or the shared DEMO_KEY). Input: EITHER city (e.g. 'Washington') + state (2-letter, e.g. 'DC') OR zip (5-digit) — supplying BOTH, or NEITHER, ⇒ invalid_input with 0 fetch; optional year (default: the current U.S. federal fiscal year). Returns { rates:[{ city, county, state, zip, year, isOconus, standardRate, mealsUsd, monthlyLodgingUsd:[{ month (1-12), monthName, lodgingUsd }] }] } + honest _meta. HONESTY: lodgingUsd (the API's monthly value) is the MAX nightly lodging ceiling for that month — it VARIES SEASONALLY (hence a per-month array), and mealsUsd is the daily M&IE ceiling; both are integer US dollars, null-when-withheld (NEVER 0 — a genuine 0 is preserved). standardRate/isOconus are booleans coerced from the API's string 'true'/'false' (an unrecognized value ⇒ null, never a fabricated false); the months array is preserved AS-IS (never padded to 12). The API returns the COMPLETE rate set (no pagination) ⇒ totalAvailable = the row count, complete:true. A genuine no-match (rates:[]/rate:[]) ⇒ honest empty (returned:0); the API's errors field non-null ⇒ invalid_input carrying the message (never a fake empty); a 429 (DEMO_KEY ~10 req/hr, hit quickly) ⇒ rate_limited THROWS; a 5xx/timeout ⇒ upstream_unavailable THROWS; a 200 non-JSON ⇒ schema_drift. DEMO_KEY ~10 req/hr shared ceiling — set DATA_GOV_API_KEY (free at api.data.gov/signup) for 1000/hr. The key rides ONLY in the X-Api-Key header (never the URL/_meta).

ParametersJSON Schema
NameRequiredDescriptionDefault
zipNoA 5-digit ZIP code (e.g. '20001'). The alternative lookup mode to city+state. Validated ^\d{5}$. Use EITHER zip OR (city + state) — not both.
cityNoThe city name (e.g. 'Washington', 'San Francisco'). Requires `state`. Validated ^[A-Za-z .'\-]{1,60}$. Use EITHER (city + state) OR zip — not both.
yearNoThe per-diem fiscal year (default: the current U.S. federal fiscal year, computed at call time — GSA sets rates per FY, Oct 1–Sep 30). Validated ^\d{4}$ (it rides in the request path).
stateNoThe 2-letter state/territory code (e.g. 'DC', 'CA'). Required with `city`. Validated ^[A-Za-z]{2}$.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes beyond annotations (readOnlyHint, openWorldHint) by detailing return structure, seasonal variation, null vs 0 handling, error scenarios (429, 5xx, non-JSON), and API key usage. No contradictions with annotations.

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 verbose but well-structured with clear sections. Every sentence adds necessary detail for correct usage. Could be slightly more concise, but it is not wasteful.

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?

Given no output schema, the description thoroughly explains the return object, including nested fields like monthlyLodgingUsd. It covers error conditions and key management, making it complete for effective tool use.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining why city+state must be together, default fiscal year computation, and validation patterns. It does not repeat schema but provides useful context.

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 looks up GSA Federal Travel PER-DIEM rates, specifying lodging and M&IE ceilings. It distinguishes from sibling tools which are mostly about contracts, awards, regulations, etc., making this unique.

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

Usage Guidelines4/5

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

The description provides explicit input requirements: EITHER city+state OR zip, and warns against supplying both or neither. It also notes optional year with default behavior. However, it lacks explicit guidance on when to use this tool versus alternatives among the sibling tools, though the siblings are diverse.

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

hts_lookupA
Read-only

Look up US import-tariff classification + duty rates from the USITC Harmonized Tariff Schedule (keyless; hts.usitc.gov/reststop/search) — the IMPORT-TARIFF / supply-chain PRICE lane a product-reseller / supply-chain bidder needs to price a hardware or commodity contract (extends the THIN Price lane with a NON-labor cost input, a sibling of gsa_benchmark_labor_rates). A single query serves BOTH modes: a KEYWORD (e.g. 'laptop', 'cotton shirt') OR an HTS number (e.g. '8471.30' / '8471.30.01.00') — both ride the keyword= search. Returns { query, lines:[{ htsno, statisticalSuffix, indent, description, units, columnOneGeneral, specialPreferential, columnTwo, additionalDuties, footnotes, quotaQuantity, effectivePeriod, status, isChapter99 }] } + honest _meta. ★DUTY-RATE HONESTY (the crux): columnOneGeneral (Column-1 General), specialPreferential (Special/preferential/FTA), and columnTwo (Column-2) are AUTHORITATIVE VERBATIM TEXT surfaced as strings — 'Free', a percentage ('35%'), a specific rate ('0.47¢/kg'), a compound/range, or null — NEVER coerced to a number (a coerced 0/NaN would fabricate a false 'duty-free'); an empty Special ('') → null = NO special-program rate published (NEVER read as Free). ★HIERARCHY (M1): a lookup returns rows across levels; the rate is stated ONCE at a shallower level (usually the 6/8-digit subheading) and inherits DOWNWARD to the blank statistical-suffix lines — to find a specific line's rate, read UP to the nearest ANCESTOR line (shallower indent, same htsno prefix) with a non-empty rate; a blank deepest line is NOT no/unknown duty. ★ADDITIONAL DUTIES (S1): the per-line additionalDuties is frequently null even when Section 301/232 duties apply — the real additional duty rides the Chapter-99 rows (isChapter99:true, htsno beginning '99') returned alongside the base line + the footnotes; they STACK on the base rate. ★COMPLETENESS (M2): the endpoint returns the FULL match array with NO server-side total and NO working pagination (offset is IGNORED) → totalAvailable is the EXACT served array length and paging is CLIENT-SIDE; there is no fixed cap (a single-char/common fragment can return 10,000–16,000+ rows / several MB), so query must be ≥3 non-whitespace chars (a 1–2 char query is rejected invalid_input before the fetch). limit (≤200, def 50), offset. A no-match ⇒ honest empty; a 404/5xx/timeout/non-array/HTML(→schema_drift) ⇒ THROWS (never a fake empty); a transient 400 on the validated query ⇒ upstream_unavailable (retryable). NOT a binding CBP classification ruling and NOT a landed-cost quote — the duty owed depends on country of origin + trade program + Section 301/232 / Chapter-99 additional duties + footnotes; confirm via CBP (CROSS / eRulings). The not-a-ruling caveat rides EVERY response.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRows per page (CLIENT-SIDE slice over the served array), 1..200, default 50.
queryYesREQUIRED — a KEYWORD (e.g. 'laptop', 'cotton shirt') OR an HTS number (e.g. '8471.30' or '8471.30.01.00'); both ride the `keyword=` search. Must be ≥3 non-whitespace chars (a 1–2 char/single-char fragment can make USITC serve 10,000–16,000+ rows / several MB). Returns the matching classification rows across the HTS hierarchy with the Column-1 General / Special / Column-2 duty-rate TEXT + Chapter-99 additional-duty provisions.
offsetNo0-based row offset for CLIENT-SIDE pagination over the served array (the endpoint has no server-side pagination), default 0.

TDQS

A4.6/5.0
Behavior5/5

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

The description extensively discloses behavioral traits beyond annotations: duty-rate honesty (no numeric coercion), hierarchy inheritance, additional duties via Chapter-99, pagination behavior (offset ignored, client-side slice), error handling, and query length restrictions. No contradictions with annotations (readOnlyHint, openWorldHint).

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 lengthy but well-structured with headings indicated by stars, and each paragraph serves a distinct purpose (duty-rate honesty, hierarchy, additional duties, completeness). Every sentence is informative; no fluff. Could be slightly more concise but justified by complexity.

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

Completeness5/5

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

No output schema exists, so the description must explain return values and edge cases. It details the response structure (query, lines array with fields), includes error behavior (throws on 404/5xx, invalid input, transient 400), and covers no-match case. Very complete for a lookup tool.

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

Parameters4/5

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

Schema description coverage is 100%, and the description adds meaningful context: query must be ≥3 non-whitespace chars, limit ≤200 default 50, offset is client-side. It reinforces the dual-mode of query (keyword vs HTS number). This goes beyond the schema.

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

Purpose5/5

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

The description clearly states it looks up US import-tariff classification and duty rates from USITC HTS. It specifies the resource (Harmonized Tariff Schedule) and action (lookup). It distinguishes itself from sibling tool gsa_benchmark_labor_rates by noting it extends the price lane with a non-labor cost input.

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

Usage Guidelines4/5

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

The description provides explicit guidance on when to use the tool (for import-tariff pricing in supply-chain contexts) and what it is not (not a binding ruling, not a landed-cost quote). It names a sibling (gsa_benchmark_labor_rates) but does not systematically list alternatives for each context. Overall, usage context is clear.

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

lda_search_filingsA
Read-only

Search US Senate LDA (Lobbying Disclosure Act) filings — who is paid HOW MUCH to lobby WHICH federal agency on WHICH issue (lda.senate.gov/api/v1/filings, KEYLESS — anonymous access works; an optional free LDA_API_KEY only raises the rate limit). All inputs optional: registrantName (the lobbying firm/in-house filer), clientName (who it's for), lobbyistName, filingYear (4-digit), filingType (short code, e.g. 'Q1'/'RR'/'YE'), agency (NOTE: /filings/ has NO server-side agency filter — the LDA API silently ignores it, so it is reported in _meta.filtersDropped and NOT applied; government entities are nested per activity in lobbyingActivities[].governmentEntities), issue (specific lobbying issues text), page (1-based, default 1), pageSize (1..25, default 25). Returns { filings:[{ filingUuid, filingType, filingYear, filingPeriod, incomeUsd, expensesUsd, registrant, client, lobbyingActivities:[{ issueCode, description, governmentEntities:[names] }], documentUrl, postedDate, terminationDate }] } + honest _meta. HONESTY: totalAvailable is the API's REAL total match count (the corpus is ~1.95M filings) — NOT the rows on this page; pagination is page-based (pass the next page number when hasMore). incomeUsd/expensesUsd are parsed from the null-or-decimal-string income/expenses — null (not reported) ⇒ null, NEVER 0 (a genuine 0 stays 0); a filing reports EITHER income OR expenses, so the other is typically null. Missing lobbying_activities/government_entities ⇒ empty arrays (never fabricated). A genuine no-match (results:[]) ⇒ honest empty (returned:0); a 400 (bad filter) ⇒ invalid_input surfacing the API's message; a 429 ⇒ rate_limited THROWS (Retry-After honored, never routed around); a 5xx/timeout ⇒ upstream_unavailable THROWS; a 200 non-JSON / non-array results / non-number count ⇒ schema_drift. The optional key rides ONLY in the Authorization: Token header (never the URL/_meta).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number (default 1). Page with the next page number from _meta.notes / when _meta.pagination.hasMore.
issueNoFilter by the specific lobbying issues text (maps to filing_specific_lobbying_issues), e.g. 'appropriations'.
agencyNoNOTE: the keyless /filings/ endpoint has NO server-side government-entity filter — the LDA API silently ignores it, so this value is NOT applied (reported in _meta.filtersDropped, never as a narrowed total). Government entities are nested per lobbying activity (each filing's lobbyingActivities[].governmentEntities); to find who lobbied an agency, narrow by registrantName/clientName/issue and inspect those nested entities. Retained for discoverability of the limitation.
pageSizeNoFilings per page, 1..25 (the LDA API caps at 25), default 25.
clientNameNoFilter by the client name (who the lobbying is FOR), e.g. 'Google'. Substring match, upstream-validated.
filingTypeNoFilter by the filing type short code (e.g. 'Q1' Q1 report, 'RR' registration, 'YE' year-end). A bad code ⇒ upstream HTTP 400 ⇒ invalid_input (surfaced).
filingYearNoFilter by filing year, a 4-digit year (e.g. '2024'). Validated ^\d{4}$.
lobbyistNameNoFilter by an individual lobbyist's name. Substring match, upstream-validated.
registrantNameNoFilter by the registrant (the lobbying firm / in-house filer) name, e.g. 'Akin Gump'. Substring match, upstream-validated.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations mark readOnlyHint=true, and the description adds extensive behavioral details: keyless anonymous access, rate limit handling, honest pagination, specific handling of income/expenses (null vs 0), empty arrays, and error types (400, 429, 5xx, schema_drift). This provides exceptional transparency beyond the annotations.

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 comprehensive and well-structured, starting with purpose, then parameter notes, return format, and error handling. While somewhat lengthy, each sentence adds unique value; no waste. Minor conciseness improvement possible by grouping related notes.

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?

Given no output schema, the description provides a detailed return structure and covers all critical aspects: input parameters, pagination, data interpretation, error states, and authentication. It leaves no significant gaps for a complex API with 9 optional parameters.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. The description adds valuable context: agency filter is silently ignored, authentication key goes in header, validation for filingYear, and filingType mapping examples. This enhances the schema definitions without redundancy.

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 it searches US Senate LDA filings and enumerates available filters (registrantName, clientName, etc.). It distinguishes from sibling tools by being specific to lobbying data, with no ambiguity.

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

Usage Guidelines4/5

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

The description explains when to use the tool (searching LDA filings) and details all parameters being optional. It notes the agency filter limitation and advises alternative approaches (inspecting lobbyingActivities). However, it does not explicitly state when not to use it or list alternative tools, though siblings are clearly other government data tools.

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

nhtsa_complaintsA
Read-only

Look up NHTSA consumer COMPLAINTS for a specific vehicle — owner-filed safety complaints with the affected component, crash/fire flags, injury/death counts, and incident/filing dates (NHTSA /complaints/complaintsByVehicle; api.nhtsa.gov). KEYLESS — no API key is required or accepted. Input: make (required, e.g. 'honda'), model (required, e.g. 'accord'), modelYear (required, 4-digit, e.g. '2020'). Returns { complaints:[{ odiNumber, manufacturer, component, summary, crash, fire, numberOfInjuries, numberOfDeaths, dateOfIncident, dateComplaintFiled }] } + honest _meta. ★PRIVACY: the NHTSA complaint VIN (an individual-vehicle identifier) is INTENTIONALLY EXCLUDED from the output — the B2G signal is the manufacturer/component/crash/fire/injury/death safety history, not the VIN. HONESTY: totalAvailable is NHTSA's EXACT count and NHTSA returns the COMPLETE set for the vehicle (no pagination) ⇒ complete:true; a no-match ⇒ an HONEST EMPTY (returned:0), NOT an error; crash/fire preserved as booleans (never a fabricated false); numberOfInjuries/numberOfDeaths via numeric coercion (a genuine 0 stays 0, NEVER null-for-0); dates are strings; a 4xx ⇒ invalid_input; a 5xx/timeout ⇒ THROWS; a 200 non-JSON ⇒ schema_drift. Fixed host api.nhtsa.gov (SSRF-guarded); make/model are letters/digits/space/hyphen only and modelYear is ^\d{4}$.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeYesVehicle make (required), e.g. 'honda', 'ford'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$).
modelYesVehicle model (required), e.g. 'accord', 'f-150'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$).
modelYearYes4-digit model year (required), e.g. '2020'. Validated ^\d{4}$.

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses extensive behavior: complete results (no pagination), honest empty returns, boolean preservation for crash/fire, numeric coercion, error handling for various HTTP statuses, input validation patterns, fixed host, and intentional VIN exclusion. No contradictions with annotations.

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 long but well-structured, starting with purpose, then input, output, privacy, honesty, and errors. Each sentence adds value, though it could be slightly trimmed without losing clarity. Front-loaded with core 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?

Despite lacking an output schema, the description provides a detailed specification of return fields (odiNumber, manufacturer, component, etc.) and data types (booleans, numbers, strings). Also covers error conditions and validation, making it complete for a complex tool.

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

Parameters3/5

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

Schema covers all 3 parameters fully with regex patterns. The description adds examples ('honda', 'accord', '2020') and reiterates requirements, but does not introduce new semantic meaning beyond the schema. Baseline 3 is appropriate given 100% schema coverage.

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 opens with 'Look up NHTSA consumer COMPLAINTS for a specific vehicle', clearly stating the verb and resource. It specifies owner-filed safety complaints and distinguishes from recalls implicitly by focusing on complaints.

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 mentions 'KEYLESS — no API key is required or accepted' which is a feature but does not explicitly guide when to use this tool over alternatives like nhtsa_recalls. The usage context is clear but lacks explicit when-not or alternative tool mentions.

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

nhtsa_recallsA
Read-only

Look up NHTSA vehicle safety RECALLS for a specific vehicle — the manufacturer's recall campaigns with the affected component, the safety consequence, the remedy, and 'do not drive'/'park outside'/over-the-air-update flags (NHTSA /recalls/recallsByVehicle; api.nhtsa.gov). KEYLESS — no API key is required or accepted. Input: make (required, e.g. 'honda'), model (required, e.g. 'accord'), modelYear (required, 4-digit, e.g. '2020'). Returns { recalls:[{ campaignNumber, manufacturer, component, summary, consequence, remedy, reportReceivedDate, parkIt, parkOutside, overTheAirUpdate }] } + honest _meta. HONESTY: totalAvailable is NHTSA's EXACT Count and NHTSA returns the COMPLETE set for the vehicle (no pagination) ⇒ complete:true; a no-match (Count 0 / a bad make/model) ⇒ an HONEST EMPTY (returned:0), NOT an error; a 4xx ⇒ invalid_input; a 5xx/timeout ⇒ THROWS; a 200 non-JSON ⇒ schema_drift. The park-it/park-outside/over-the-air-update flags are preserved as booleans (never a fabricated false); dates are strings; every scalar is null-never-empty-string. Fixed host api.nhtsa.gov (SSRF-guarded); make/model are letters/digits/space/hyphen only and modelYear is ^\d{4}$.

ParametersJSON Schema
NameRequiredDescriptionDefault
makeYesVehicle make (required), e.g. 'honda', 'ford'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$).
modelYesVehicle model (required), e.g. 'accord', 'f-150'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$).
modelYearYes4-digit model year (required), e.g. '2020'. Validated ^\d{4}$.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes beyond annotations by detailing honesty guarantees (complete:true, no pagination, empty instead of error, boolean flags preserved as is), error handling (4xx vs 5xx vs 200 non-JSON), and input validation (regex patterns). This adds significant context beyond the readOnlyHint and openWorldHint annotations.

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 relatively long but well-structured with clear sections for behavior, input, output, and honesty. Every sentence adds necessary detail, though some redundancy with the schema exists.

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?

Given the absence of an output schema, the description fully specifies the return structure and field semantics (dates as strings, null vs empty string, boolean flags). It also covers all edge cases and error modes, making the tool's behavior fully predictable.

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?

The input schema already describes all three parameters with 100% coverage. The description reinforces the validation patterns and adds examples, providing marginal added value beyond the schema.

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

Purpose5/5

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

The description starts with a specific verb-noun pair ('Look up NHTSA vehicle safety RECALLS') and immediately clarifies the tool's resource and domain. It distinguishes from sibling tools like 'nhtsa_complaints' by specifying safety recalls rather than complaints.

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 explicitly states that no API key is required ('KEYLESS — no API key is required or accepted'), which is a key usage guideline. It also details the required input parameters. However, it does not explicitly mention when not to use this tool or provide alternatives among siblings.

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

nih_reporter_search_projectsA
Read-only

Search awarded NIH RePORTER research-GRANT projects (keyless; api.reporter.nih.gov v2, POST/JSON — the FIRST non-GET getJson-port consumer) — the NEW federal research-funding recipient-enrichment axis (who receives NIH research money, by organization / state, joinable to SAM/USAspending via primary_uei). Structured, LIVE-CONFIRMED-narrowing criteria ONLY, AND-combined in a module-built body (NO raw passthrough): orgStates (UPPERCASE 2-letter USPS enum — the SSRF + silent-zero guard; a lowercase/unknown code silently returns zeros), orgNames (≤512 each, ≤20), fiscalYears (int array 1985..currentYear+1, ≤20), limit (1..500, def 50), offset (0..14,999, def 0). Returns { projects:[{ projectNum, projectTitle, fiscalYear, awardAmount, organization:{ name, state, primaryUei, primaryDuns, ueis, duns }, principalInvestigators, contactPiName, fundingIc }] } + honest _meta. HONESTY: (M2) records are RESEARCH GRANTS, NOT procurement contracts — primary_uei joins to SAM/USAspending recipients but the award nature differs (disclosed in every _meta.notes); totalAvailable = the EXACT meta.total (NEVER the page size, NEVER a lower bound); NIH caps keyless retrieval at the first 15,000 records (offset 0..14,999) — offset ≥ 15,000 ⇒ invalid_input, and past the window the count stays exact while records are UNREACHABLE (disclosed in a note; nextOffset is never a dead-end). Disclose-not-refuse: an unscoped query still returns the first page + the exact total + a narrow-your-criteria note. agencyIcCodes is intentionally NOT a filter (NIH silently drops it — it would be a false 'applied'). Genuine-empty (total:0) ⇒ complete:true/total:0; an outage/5xx/timeout THROWS; a 400 (bad offset/limit/type) ⇒ invalid_input; a 200 body that isn't {meta,results} or a non-numeric meta.total ⇒ schema_drift (never a fake empty). awardAmount is number|null (a real $0 award is 0, an absent amount is null).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoProjects per page (upstream hard cap 500), 1..500, default 50.
offsetNo0-based offset into the result set. HARD-CAPPED at 14,999: NIH caps keyless retrieval at the first 15,000 records (offset 0..14,999), so offset ≥ 15,000 is refused (invalid_input) — narrow criteria to reach records beyond the window. The count (totalAvailable) stays EXACT past the window.
orgNamesNoRecipient-organization name filter values (each ≤512 chars, max 20). LIVE-CONFIRMED to narrow. e.g. ['MASSACHUSETTS INSTITUTE OF TECHNOLOGY']. A value matching no org returns a genuine total:0.
orgStatesNoRecipient-organization US state/territory 2-letter USPS codes (UPPERCASE — the enum is the SSRF value guard + the silent-zero guard: a lowercase 'ca' or an unknown 'ZZ' silently returns zeros, so a typo is an invalid_input, never read as 'no NIH funding'). LIVE-CONFIRMED to narrow. e.g. ['CA','MA']. Max 20.
fiscalYearsNoNIH fiscal years to include (int array, 1985..2027, max 20). LIVE-CONFIRMED to narrow. e.g. [2023,2024].

TDQS

A4.5/5.0
Behavior5/5

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

The description is extremely transparent beyond annotations. It details the POST method, error handling (invalid_input, schema_drift), caps, exact totals, and honesty about unreachable records. Annotations (readOnlyHint, openWorldHint) are simple, and the description adds significant behavioral context without contradiction.

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 verbose but well-structured, using sections, examples, and warnings. Every sentence adds value. It could be slightly shorter, but given the complexity (5 parameters, no output schema), the length is justified. It is not excessively wordy.

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?

The description is highly complete for a tool with no output schema. It describes the return structure, error conditions, and edge cases (empty results, outages, drift). Parameter count and complexity are high, but every aspect is covered, including honesty notes. No missing information.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial value beyond parameter names and types. It explains case sensitivity for orgStates, the cap and behavior for limit/offset, and live-conformation for all filters. This helps an agent understand proper usage and edge cases.

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 that the tool searches awarded NIH RePORTER research-grant projects. It specifies the API and data nature, but does not explicitly contrast with sibling tools. However, the unique focus on NIH grants makes it distinct among the listed siblings, which are primarily USASpending and other federal tools.

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

Usage Guidelines4/5

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

The description provides detailed usage guidelines, including constraints (offset cap, keyless retrieval), warnings about agencyIcCodes being omitted, and notes on data nature (grants vs contracts). It does not explicitly say when not to use this tool, but the limitations serve as implicit guidance. More explicit alternative references would improve it.

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

nist_800_53_controlsA
Read-only

Look up NIST SP 800-53 Rev 5 security & privacy CONTROLS (keyless) — the requirement backbone for FedRAMP / CMMC / RMF compliance work. Retrieve a control by controlId (exact, e.g. 'AC-2', 'SC-7', 'AC-2(1)'), a family (2-letter code 'AC'/'SC'/'IA' or a name substring 'Access Control'), and/or a keyword (case-insensitive substring over title + statement); limit/offset pagination. Each row: { id (e.g. 'AC-2'), family (e.g. 'AC — Access Control'), title, status ('withdrawn' | null), statement (the labelled requirement prose; NULL for a WITHDRAWN control, never ''), guidance (discussion), incorporatedInto:[control ids that superseded a withdrawn control, e.g. AC-13 → ['AC-2','AU-6']], enhancements:[{id,title}] (e.g. AC-2(1)) }. Complements cve_lookup + cisa_kev_lookup (the vulnerability side) with the CONTROL/requirement side. HONESTY: source is NIST's OFFICIAL OSCAL catalog published at github.com/usnistgov/oscal-content (authoritative first-party data served from GitHub, not a .gov API host — provenance disclosed in _meta); the exact OSCAL version + last-modified are surfaced in _meta (the catalog is fetched live from the MOVING 'main' branch, so control text can shift between point releases, e.g. 5.1.1 → 5.2.0 — cite the version, not just 'Rev 5'); a WITHDRAWN control (status:'withdrawn') has statement:null and is NOT an active requirement (see incorporatedInto for what replaced it); the catalog has no query API so filtering is CLIENT-SIDE and totalAvailable is the EXACT match count; this is the REQUIREMENT text only — applicability depends on the system's FIPS-199 impact baseline (Low/Moderate/High), which the catalog does not encode (disclosed); a download failure or an implausibly-truncated catalog (< 15 families) THROWS (never a fake-empty 'control not found').

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax controls returned (default 25, max 200).
familyNoControl family — the 2-letter code ('AC', 'SC', 'IA') OR a substring of the family name ('Access Control', 'Audit'). Case-insensitive.
offsetNoZero-based page offset (default 0).
keywordNoCase-insensitive substring searched over the control title + requirement statement.
controlIdNoExact control identifier, e.g. 'AC-2', 'SC-7', 'AC-2(1)' (case-insensitive; zero-padding is normalized).

TDQS

A5/5.0
Behavior5/5

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

Discloses source provenance (OSCAL catalog from github.com/usnistgov/oscal-content), version handling (live from moving main branch), behavior for withdrawn controls (statement null, incorporatedInto), client-side filtering (no query API), and error handling (throws on download failure or truncated catalog). Annotations already declare readOnlyHint and openWorldHint, but description adds substantial behavioral context beyond those.

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?

Front-loaded with purpose in first sentence. All sentences add value: parameter usage, output details, honesty section. No fluff; length is appropriate for the tool's complexity. Well-structured with clear sections.

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?

Given no output schema, description fully covers return fields including id, family, title, status, statement, guidance, incorporatedInto, and enhancements. Addresses edge cases (withdrawn controls, client-side filtering, error behavior). Complements sibling tools and provides complete context for usage.

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

Parameters5/5

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

Schema coverage is 100% and description adds significant meaning: explains controlId exact matching (case-insensitive, zero-padding normalized), family accepts code or name substring, keyword is case-insensitive substring over title+statement, limit/offset for pagination. Also details output structure for each parameter.

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 looks up NIST SP 800-53 Rev 5 security and privacy controls, identifies it as keyless requirement backbone for FedRAMP/CMMC/RMF, and distinguishes from sibling tools cve_lookup and cisa_kev_lookup by specifying it covers the control/requirement side versus the vulnerability side.

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

Usage Guidelines5/5

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

Explicit guidance on when to use: searching by controlId, family, keyword with pagination. Provides alternatives (cve_lookup, cisa_kev_lookup) for vulnerability side. Clearly states limitations: requirement text only, not applicability encoding, and that the catalog is from a moving branch so version can shift.

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

nonprofit_financialsA
Read-only

Fetch ONE US tax-exempt nonprofit's IRS Form 990 profile + FINANCIALS by EIN via ProPublica Nonprofit Explorer (projects.propublica.org/nonprofits/api/v2/organizations/{ein}.json). ★PROVENANCE: the DATA is IRS Form 990 filings (federal tax-exempt public records) but the API is ProPublica Nonprofit Explorer, run by ProPublica (a NON-PROFIT newsroom) — NOT a .gov API; ProPublica republishes these records KEYLESS because the IRS has no clean query API. KEYLESS (no key). Input: ein (required — the Employer Identification Number, 1..9 digits ^\d{1,9}$, e.g. '530196605' American National Red Cross; rides the URL path). Returns { organization:{ ein, name, address, city, state, zip, nteeCode, subsectionCode, rulingDate, statusCode }, filings:[{ taxYear, formType, revenueUsd, expensesUsd, assetsUsd, liabilitiesUsd, pdfUrl }] } + honest _meta. HONESTY: the four Form 990 figures (revenueUsd/expensesUsd/assetsUsd/liabilitiesUsd, from totrevenue/totfuncexpns/totassetsend/totliabend) ride null-never-0 coercion — a genuine reported 0 stays 0, an absent figure ⇒ null (NEVER 0-faked); ein/codes are strings; rulingDate is a date string. totalAvailable = filings.length (the COMPLETE Form 990 filing set from the one detail document — no pagination). An unknown EIN (HTTP 404) ⇒ not_found (NEVER a fabricated empty org); a 4xx ⇒ invalid_input; a 429 ⇒ rate_limited THROWS; a 5xx/timeout ⇒ upstream_unavailable THROWS; a 200 non-JSON / non-object organization / non-array filings_with_data ⇒ schema_drift. Data is IRS Form 990 data via ProPublica Nonprofit Explorer, disclosed in _meta.source and a note.

ParametersJSON Schema
NameRequiredDescriptionDefault
einYesThe organization's EIN (Employer Identification Number), 1..9 digits, e.g. '530196605' (American National Red Cross). Validated ^\d{1,9}$; rides the URL path.

TDQS

A4.7/5.0
Behavior5/5

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

Goes far beyond annotations: explains data provenance (ProPublica, not .gov), keyless access, null-vs-0 coercion, complete error mapping (404→not_found, 429→rate_limited, 5xx→upstream_unavailable, schema drift), and pagination (no pagination). Annotations already provide readOnlyHint and openWorldHint, but description adds rich behavioral context.

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 front-loaded with the core purpose, then efficiently structures details in logical order: provenance, input, return structure, data honesty, error handling, and meta. Every sentence is informative with no redundancy, achieving thoroughness without verbosity.

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?

Given no output schema, the description fully explains return structure (organization fields and filings array with field meanings), error responses, pagination, and data source. It covers all essential aspects for an agent to correctly interpret results and handle errors.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description adds value by providing an example EIN ('530196605'), explaining validation pattern, and noting it rides the URL path. This extra context improves understanding beyond the schema alone.

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 specifies the exact verb 'Fetch', resource 'nonprofit's IRS Form 990 profile + FINANCIALS', and input 'by EIN'. It clearly distinguishes from sibling tools like 'nonprofit_search' by focusing on a single EIN retrieval with detailed financial data.

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 implicitly conveys usage: use when you have an EIN and need financials. However, it lacks explicit guidance on when not to use it or direct references to alternatives (e.g., 'nonprofit_search' to find EINs). The context is clear but not exhaustive.

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

nppes_lookup_providerA
Read-only

Keyless CMS/HHS NPPES NPI Registry lookup — the authoritative PUBLIC registry of every US healthcare provider (individual NPI-1 + organization NPI-2), for VA/HHS/CMS subcontractor/provider/teaming due-diligence (validate an NPI, confirm taxonomy/specialty, enumeration status, practice state, org/name match). Host npiregistry.cms.hhs.gov/api (version=2.1). Mode is inferred from number (no mode flag). EXACT-NPI mode (number given): the NPI is CMS-Luhn-validated client-side (Luhn over 80840+first-9) ⇒ a typo'd NPI is invalid_input, NEVER a fake 'does not exist'; ★the wire query carries number (+version) ALONE — any co-supplied filter (last_name/state/…) is DROPPED from the wire and checked CLIENT-SIDE (disclosed in data.filterMatch:{field:bool} + data.filtersDropped), because NPPES AND-combines a number with filters and a mismatch would falsely zero a real active provider into found:false. SEARCH mode: required-one of { first_name, last_name, organization_name, taxonomy_description, city, postal_code } (state + enumeration_type are REFINERS ONLY — rejected alone); a trailing '*' wildcard on a name/org field needs ≥2 leading literal chars. Returns EXACT-mode { found, provider:{ number, enumerationType, active, status, basic{…individual OR org fields, null-never-fabricated…}, taxonomies[{code,desc,primary,state,license,taxonomyGroup}], addresses[{purpose,address1,city,state,postalCode,telephone,fax,countryCode}], practiceLocations[…same, SEPARATE from addresses], identifiers[], otherNames[], endpoints[], createdEpoch, lastUpdatedEpoch }, filterMatch? } OR SEARCH-mode { providers:[…] } + honest _meta. HONESTY: active = basic.status==='A' (a deactivated/absent NPI is NOT active); epochs are ms numeric STRINGS → number|null (null-never-0); addresses[] and practiceLocations[] are kept SEPARATE (a provider can practice in a state that appears ONLY in practiceLocations); NPPES exposes NO match total, so a full page ⇒ totalAvailable is a disclosed LOWER BOUND (totalIsLowerBound) + a ~1,200-row-per-query reach cap (limit ≤ 200, skip ≤ 1,000 — OUR policy, a PER-QUERY cap only; cross-query enumeration is not architecturally prevented). A genuine {result_count:0} ⇒ honest found:false/empty; a {Errors:[…]} 200 body (no results key) ⇒ THROWS invalid_input (never a fake empty); any 4xx/5xx/timeout/off-host-redirect ⇒ THROWS; result_count !== results.length ⇒ schema_drift. ★NOT a fitness/exclusion/licensure/sanctions determination — cross-check SAM exclusions + OFAC; individual (NPI-1) records may surface personal/home addresses + phone/fax verbatim with NO enrichment. The caveat + reach-cap disclosure ride EVERY response.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoAddress city (a required-one criterion). e.g. 'Baltimore'.
skipNo0-based pagination offset, 0..1000 (default 0). ★POLICY cap: this vetting tool reaches at most the first ~1,200 matches/query (a deliberate targeted-lookup boundary — NPPES itself no longer enforces a skip ceiling); skip > 1000 ⇒ invalid_input. Search mode only.
limitNoProviders per page, 1..200, default 10. NPPES silently clamps >200; this tool rejects it loudly. Search mode only.
stateNoUS state/territory 2-letter USPS code — a REFINER only (never sufficient alone ⇒ invalid_input; NPPES rejects 'state' as the sole criterion). e.g. 'MD'.
numberNoExact NPI — 10 digits (^\d{10}$). Triggers EXACT-NPI mode: the wire query carries number (+version) ALONE (any co-supplied filter is DROPPED from the wire and checked client-side, disclosed in data.filterMatch — NPPES AND-combines a number with filters, so a mismatched filter would falsely zero a real active provider). Also client-side CMS-Luhn-validated (Luhn over 80840+first-9): a typo'd NPI ⇒ invalid_input, NEVER a fake 'does not exist'. e.g. '1104130236'.
last_nameNoIndividual provider last name (a required-one criterion). Trailing '*' wildcard: ≥2 leading chars. e.g. 'Smith'.
first_nameNoIndividual provider first name (a required-one criterion). A trailing '*' wildcard needs ≥2 leading literal chars. e.g. 'John'.
postal_codeNoAddress postal/ZIP code (a required-one criterion; a prefix like '212' is allowed). e.g. '21218'.
enumeration_typeNoREFINER only (NPI-1 = individual, NPI-2 = organization). Never sufficient alone (⇒ invalid_input) — must accompany a required criterion.
organization_nameNoOrganization (NPI-2) name (a required-one criterion). Trailing '*' wildcard: ≥2 leading chars. e.g. 'Mayo Clinic'.
taxonomy_descriptionNoProvider taxonomy/specialty description (a required-one criterion). e.g. 'Internal Medicine'.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds extensive behavioral detail: client-side Luhn validation, filter dropping disclosure, honesty about active status interpretation, null handling (epochs), lower bound on total matches, rate limits (skip/limit policy), error handling (throws for invalid input or errors), and disclosure that personal addresses may be returned. No contradictions with annotations.

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 thorough but very long; every sentence adds value but could benefit from better structuring (e.g., sections for modes, parameters, caveats). It is front-loaded with purpose but then dense. While not overly verbose for the complexity, it could be more scannable.

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?

Given the tool's complexity (two modes, 11 parameters, no output schema), the description is remarkably complete. It explains return format, error handling, pagination constraints, and key caveats (e.g., totalIsLowerBound, practice locations separate from addresses). It also addresses what the tool does not cover (exclusions, sanctions), ensuring the agent uses it appropriately.

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

Parameters5/5

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

Schema description coverage is 100%, but the description adds significant meaning beyond schema: Luhn validation for `number`, wildcard rules for name fields, refiner-only behavior for `state` and `enumeration_type`, pagination policy for `skip` and `limit`, and exact-mode behavior for `number` (drops other filters). This enriches the agent's understanding of each parameter's role.

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 it is a keyless CMS/HHS NPPES NPI Registry lookup for healthcare provider validation, with specific verb 'lookup' and resource 'NPI Registry'. It distinguishes between exact NPI mode and search mode, and specifies the intended use case (due-diligence) and what it is not for (exclusions/sanctions).

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

Usage Guidelines5/5

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

Provides explicit guidance on when to use exact mode vs search mode, what parameters are required vs refiners (e.g., state and enumeration_type are refiners only), and how mode is inferred from the `number` parameter. Warns about filter dropping in exact mode and recommends cross-checking with SAM exclusions and OFAC for fitness determinations.

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

nsf_get_awardA
Read-only

Fetch ONE NSF award by its numeric award id (keyless; api.nsf.gov/services/v1/awards.json). Input awardId (all-digit, 5..9 digits — NSF ids are 7-digit numeric, live-verified; numeric-only is injection-safe). Returns { found, award:{ …the FULL curated record INCLUDING abstractText… } } + honest _meta. A nonexistent id ⇒ a genuine empty (totalCount:0) ⇒ found:false / award:null (NEVER a fabricated record). HONESTY: NSF Awards are RESEARCH GRANTS, NOT procurement contracts (ueiNumber joins to SAM/USAspending but the award nature differs — disclosed every response); fundsObligatedAmt/estimatedTotalAmt arrive as STRINGS → number|null (a real $0 is 0, absent is null); a serviceNotification at HTTP 200 ⇒ invalid_input/upstream_unavailable THROWS; an outage/5xx ⇒ THROWS; a 200 body that isn't {response:{award,metadata}} ⇒ schema_drift (never a fabricated record).

ParametersJSON Schema
NameRequiredDescriptionDefault
awardIdYesNSF award id — an all-digit id (5..9 digits; NSF ids are 7-digit numeric, live-verified). Returns the ONE full award record INCLUDING abstractText; a nonexistent id ⇒ found:false (never a fabricated record). e.g. '2545697'.

TDQS

A4.5/5.0
Behavior5/5

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

The description extensively discloses behavior beyond annotations: non-existent id returns found:false, never fabricated records; type handling of monetary fields; error conditions like serviceNotification and schema drift. This adds significant value over the readOnlyHint and openWorldHint annotations.

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 lengthy and includes many verbose details (e.g., about NSF award nature, type conversions). Although each piece adds value, the overall length could be reduced for better conciseness without losing essential information.

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?

Given the simple tool and lack of output schema, the description fully covers input, expected behavior, error cases, and return shape. It addresses all necessary aspects for an AI agent to use the tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, and the description reinforces the schema's description of awardId with additional details on digit length and validation. While not entirely new, it provides helpful elaboration that aids correct usage.

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 'Fetch ONE NSF award by its numeric award id', specifying the exact resource and action. It distinguishes itself from sibling 'nsf_search_awards' by emphasizing 'ONE' and the specific numeric id format.

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

Usage Guidelines4/5

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

The description provides clear usage context, including input validation (all-digit, 5-9 digits) and the data nature (research grants vs. contracts). However, it lacks explicit guidance on when not to use this tool or direct alternatives among siblings.

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

nsf_search_awardsA
Read-only

Search awarded NSF research-GRANT awards (keyless; api.nsf.gov/services/v1/awards.json) — the NEW federal research-funding recipient-enrichment axis (who receives NSF research money, by organization / UEI / PI / state, joinable to SAM/USAspending via ueiNumber/parentUeiNumber). The grant-SIBLING of nih_reporter_search_projects on a different agency. LIVE-CONFIRMED-narrowing filters ONLY, module-built into a URLSearchParams query (NO raw passthrough): keyword (free text; MULTI-WORD is OR-tokenized — 'machine learning' = machine OR learning, disclosed in _meta.notes), awardeeStateCode (UPPERCASE 2-letter USPS enum — the SSRF + silent-zero guard; a non-state typo silently returns 0), awardeeName, ueiNumber (12-char UEI — an EXACT SAM/USAspending join), parentUeiNumber (parent-org roll-up), pdPIName, dateStart/dateEnd (STRICT mm/dd/yyyy on the award ACTION date — a wrong format is silently mis-parsed), limit (1..100, def 25 → rpp), offset (0..9999). Returns { awards:[{ id, title, agency, cfdaNumber, transType, awardee:{ name, city, stateCode, ueiNumber, parentUeiNumber }, performanceSite, principalInvestigator:{ fullName, firstName, lastName, middleInitial, email, id }, coPrincipalInvestigators, programOfficer, amounts:{ fundsObligatedAmt, estimatedTotalAmt, fundsObligatedByYear }, dates, program, activeAward, historicalAward }] } (abstract EXCLUDED — use nsf_get_award) + honest _meta. HONESTY: NSF Awards are RESEARCH GRANTS, NOT procurement contracts (ueiNumber joins to SAM/USAspending but the award nature differs — disclosed every response); totalAvailable = the EXACT metadata.totalCount below 10,000 and SATURATES at 10,000 (an ES track_total_hits cap ⇒ totalIsLowerBound:true + a note — the true total is ≥10,000 and only the first 10,000 are retrievable); NSF caps keyless retrieval at offset+rpp ≤ 10,000 (offset ≥ 10,000 ⇒ invalid_input; the outgoing rpp is clamped so a page never crosses the window). fundsObligatedAmt/estimatedTotalAmt arrive as STRINGS → number|null (a real $0 is 0, absent is null). Genuine-empty (totalCount:0) ⇒ complete:true/total:0; a serviceNotification at HTTP 200 (bad param / deep offset) ⇒ invalid_input/upstream_unavailable THROWS (never a fake empty); an outage/5xx/timeout THROWS; a 200 body that isn't {response:{award,metadata}} or a non-numeric totalCount ⇒ schema_drift. Feed a row's id to nsf_get_award for the full record + abstractText.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoAwards per page (→ NSF rpp), 1..100, default 25. The OUTGOING page size is clamped so offset+rpp ≤ 10,000 (crossing NSF's retrieval window triggers a FATAL).
offsetNo0-based offset. HARD-CAPPED at 9,999: NSF caps keyless retrieval at the first 10,000 records (offset+rpp ≤ 10,000), so offset ≥ 10,000 is refused (invalid_input) — narrow criteria to bring the set under 10,000.
dateEndNoAward ACTION-date upper bound. STRICT mm/dd/yyyy (same semantics/foot-gun as dateStart). e.g. '12/31/2024'.
keywordNoFree-text search over title/abstract. NOTE: NSF OR-tokenizes a MULTI-WORD keyword (matches ANY word, not the phrase — 'machine learning' = machine OR learning, a far broader set; disclosed in _meta.notes). Use a single distinctive word or add a scoping filter for a precise set.
pdPINameNoPrincipal-investigator name filter (2..120 chars). LIVE-CONFIRMED to narrow. e.g. 'Bell'.
dateStartNoAward ACTION-date lower bound (the initial award/obligation date, NOT the project startDate — live-verified). STRICT mm/dd/yyyy; a wrong format (yyyy-mm-dd) is silently mis-parsed by NSF (not an error), so it is rejected. e.g. '01/01/2024'.
ueiNumberNoAwardee UEI — a 12-char alphanumeric SAM/USAspending Unique Entity ID (uppercase-normalized before sending). LIVE-CONFIRMED an EXACT recipient-graph filter (the clean SAM/USAspending join). e.g. 'FTMTDMBR29C7' (Johns Hopkins).
awardeeNameNoAwardee-organization name filter (2..200 chars). LIVE-CONFIRMED to narrow (a top recipient like 'Johns Hopkins University' may still saturate at the 10,000 count cap).
parentUeiNumberNoParent-organization UEI — a 12-char alphanumeric UEI for the awardee's parent entity (uppercase-normalized). LIVE-CONFIRMED an EXACT narrow (the parent-org roll-up join). e.g. 'GS4PNKTRNKL3'.
awardeeStateCodeNoAwardee-organization US state/territory 2-letter USPS code (UPPERCASE — the enum is the SSRF value guard + the silent-zero guard: a non-state typo silently returns 0 awards on NSF, indistinguishable from 'no NSF funding', so it is an invalid_input). LIVE-CONFIRMED to narrow. e.g. 'CA'.

TDQS

A4.9/5.0
Behavior5/5

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

The description extensively discloses behavioral traits beyond annotations: NSF caps retrieval at 10,000 records (totalIsLowerBound), OR-tokenization of keywords, strict date format with silent mis-parsing, SSRF guard on state code, funds as strings, error handling (serviceNotification, schema_drift, outages). No contradiction with annotations (readOnlyHint, openWorldHint).

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 long but highly information-dense. It is front-loaded with purpose and uses bold for key terms. Every sentence earns its place, but it could be more streamlined. Minor verbose phrases like 'LIVE-CONFIRMED-narrowing filters ONLY' could be simplified without losing meaning.

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?

Given no output schema, the description fully details the return structure (awards array with fields, _meta, error conditions, saturation behavior, and link to nsf_get_award). It covers limitations (10k cap), data types (strings to numbers), and edge cases (genuine empty vs. bad param). It is as complete as needed for reliable invocation.

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

Parameters5/5

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

Despite 100% schema coverage, the description adds substantial meaning: for keyword, it explains OR-tokenization and recommends single words; for offset, it explains the hard cap and invariant; for dateStart/dateEnd, it warns about format foot-gun; for ueiNumber, it clarifies exact SAM join. Each parameter's description provides practical context and edge cases beyond the schema.

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

Purpose5/5

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

The description clearly states the tool searches awarded NSF research-grant awards, explicitly distinguishes it from sibling tools (nih_reporter_search_projects for grants, nsf_get_award for full records), and provides the specific API endpoint. The verb 'search' and resource 'NSF research-grant awards' are precise and unambiguous.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: it is the grant counterpart of nih_reporter_search_projects; when to use narrowing filters to avoid the 10,000 cap; warns against multi-word keyword OR-tokenization; advises feeding a row's id to nsf_get_award for abstracts; and explains limitations like the silent-zero guard on state codes. It helps the agent decide between this and alternatives.

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

nws_active_alertsA
Read-only

List CURRENTLY-ACTIVE National Weather Service alerts — watches, warnings, and advisories (keyless; api.weather.gov). The disaster/climate-readiness lane that pairs with the FEMA tools (declarations → public assistance → hazard mitigation → LIVE active weather): where severe-weather events are active NOW, ahead of the declarations/contracts that follow. Filters: state (2-letter code → server-side ?area=, e.g. 'CA'; omit for all US), event (case-insensitive substring, e.g. 'Flood', 'Wind'), severity (Extreme/Severe/Moderate/Minor/Unknown); limit/offset pagination. Each alert: { id, event, headline, severity, urgency, certainty, category, status, messageType, areaDesc, effective, onset, expires, ends, senderName, description, instruction, response }. HONESTY: this is REAL-TIME data (alerts active at request time — a live snapshot, NOT a historical archive; read effective/expires for each window, disclosed in _meta); every scalar is null-never-empty-string and dates are ISO strings; totalAvailable is the EXACT count of matched active alerts; a NO-active-alerts result is an HONEST EMPTY (returned:0), never an error; an outage/4xx/timeout THROWS and a non-FeatureCollection body ⇒ schema_drift. A descriptive User-Agent is sent per NWS policy (no key/token).

ParametersJSON Schema
NameRequiredDescriptionDefault
eventNoFilter by event type — case-insensitive substring, e.g. 'Flood', 'Wind', 'Winter Storm'.
limitNoMax alerts returned (default 50, max 500).
stateNo2-letter US state/territory code to scope alerts (→ NWS ?area=), e.g. 'CA'. Omit for all active US alerts.
offsetNoZero-based page offset (default 0).
severityNoFilter by severity (exact): Extreme | Severe | Moderate | Minor | Unknown.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the annotations by disclosing that data is real-time, a live snapshot, not historical; that null values are never empty strings; that totalAvailable is exact; that empty results are not errors; that outages throw; and that schema drift is detected. It also confirms a descriptive User-Agent is sent. No contradictions with annotations.

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 long but well-structured: it starts with the main purpose, then explains the lane context, lists filters, describes the alert object, and ends with behavioral notes. Every sentence adds value, though it could be slightly more condensed.

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?

Given the tool's complexity (5 parameters, no output schema), the description is highly complete. It covers the tool's purpose, all filters, return object fields, behavioral nuances (null handling, error behavior), and usage context. It leaves no critical gaps for an AI agent.

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

Parameters5/5

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

With 100% schema coverage, the description still adds significant value by explaining each parameter in detail, such as 'case-insensitive substring' for event, '2-letter code → server-side ?area=' for state, and pagination defaults (limit 50, max 500). It provides context beyond the schema 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 'List CURRENTLY-ACTIVE National Weather Service alerts' with specific verbs and resource. It distinguishes from sibling tools by noting it is the 'disaster/climate-readiness lane that pairs with the FEMA tools' and that it shows live alerts as opposed to historical data or other FEMA-related actions.

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 explains each filter (state, event, severity, limit, offset) with usage details like 'omit for all US' and 'case-insensitive substring'. It provides context that the tool is for real-time alerts and pairs with FEMA tools, but does not explicitly state when not to use or list specific alternatives.

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

ofac_screen_entityA
Read-only

Keyless OFAC denied-party sanctions screening — the legally-required leg that SAM exclusions does NOT cover (31 CFR ch. V, strict-liability). Screens a name against OFAC's published SDN + Consolidated bulk lists (primary names AND AKAs from ALT.CSV joined by ent_num AND a.k.a./f.k.a./n.k.a. aliases mined from SDN/CONS Remarks — so an alias-only party like 'BNC' for BANCO NACIONAL DE CUBA is caught). Optional post-filters: type (individual|entity|vessel|aircraft), program (e.g. CUBA/IRAN/SDGT), list (sdn|consolidated|all, default all), minMatchQuality (exact|strong|weak, default weak), limit. Returns result ('potential_matches' | 'no_name_match' — NEVER 'clear'), matchCount, and per-match { name, matchedVia (primary|aka(alt)|aka(remarks)), akaType, matchQuality, list, programs, type, entNum, ofacSearchUrl }. ★SAFETY: this is a NAME SCREEN, NOT a legal determination — a no_name_match is NOT a clearance (transliterations/variants can miss a real hit) and a weak/strong hit is a REVIEW CANDIDATE requiring human adjudication against OFAC's Sanctions List Search. Every fetch failure / SSRF reject / parse drift / floor-fail THROWS (a download failure is NEVER read as a clear). minMatchQuality/type/program only trim returned matches — result reflects existence at any quality. Snapshot freshness (publish date + cache age) rides in _meta.

ParametersJSON Schema
NameRequiredDescriptionDefault
listNoWhich OFAC list(s) to screen: 'sdn' (SDN + its AKAs), 'consolidated' (non-SDN programs + AKAs), or 'all' (default — the correct default for a real screen). Every list required for the scope loads-or-throws (a partial set is never screened).
nameYesREQUIRED. The entity / individual / vessel / aircraft name to screen against OFAC's published SDN + Consolidated lists. Trimmed; empty is rejected (invalid_input) — never a no-op empty screen.
typeNoOptional post-filter on the matched party's OFAC type. A blank OFAC type is inferred as 'entity' (disclosed). Omit to screen all types. Only trims the returned matches — it never turns a real name hit into no_name_match.
limitNoMax matches returned (default 50, max 200). Over-limit truncation is disclosed, never silent.
programNoOptional case-insensitive filter to one sanctions PROGRAM code (e.g. 'CUBA', 'IRAN', 'SDGT'). Applied LOCALLY to matched rows (never on the wire); only trims returned matches (a hit under another program still yields potential_matches).
minMatchQualityNoFloor of match quality to RETURN (default 'weak'). This ONLY trims the returned matches[]; existence is computed at the lowest quality FIRST, so result is 'potential_matches' whenever ANY match exists regardless of this value (suppressed matches are disclosed).

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description discloses extensive behavioral traits: result structure, alias matching mechanism, behavior on failure (throws), minMatchQuality/type/program as post-filters, and snapshot freshness in _meta. No contradictions with 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 detailed but compact, front-loading the key purpose and legal context. Every sentence adds value, using structured sections like safety notes to organize information efficiently.

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?

Despite lacking an output schema, the description fully explains the return format and edge cases (potential_matches vs no_name_match, never 'clear'). It covers all aspects needed for correct usage, including failure scenarios and caveats about transliterations.

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

Parameters5/5

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

With 100% schema coverage, the description adds significant context beyond field names: e.g., name trimming/rejection, list loading behavior, type inference, program local filtering, and minMatchQuality only affecting returned matches. Each parameter's behavior is clarified.

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 it screens a name against OFAC's SDN and Consolidated lists, highlighting its unique coverage (including AKAs) and distinguishing it from SAM exclusions. This leaves no ambiguity about the tool's function.

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

Usage Guidelines5/5

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

The description explicitly explains when to use this tool (for OFAC checks) and provides crucial safety guidelines (no_name_match is not clearance, results require human review, failures throw). It addresses alternatives by noting what SAM exclusions do not cover.

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

openfda_device_clearancesA
Read-only

Search openFDA 510(k) DEVICE CLEARANCES — the FDA's premarket-notification (510(k)) clearances for medical devices, with the applicant/manufacturer, device name, clearance number (K-number), decision (date + description), clearance type, product code, advisory committee, and geography (openFDA /device/510k.json; api.fda.gov). KEYLESS (an OPTIONAL free OPENFDA_API_KEY only RAISES the rate limit — keyless works at ~1000 requests/day; it NEVER throws for a missing key; get one at https://open.fda.gov/apis/authentication/; call api_key_status to see every source's key requirement). Input: STRUCTURED filters — applicant (→applicant), deviceName (→device_name), productCode (→product_code), clearanceType (→clearance_type, e.g. Traditional/Special/Abbreviated), kNumber (→k_number, e.g. 'K123456'), state (2-letter, e.g. 'CA') — the tool safely assembles + escapes these into the openFDA search= Lucene string (NO raw passthrough — injection-safe), plus limit (1..100, default 25) and skip (offset ≥0). Returns { clearances:[{ applicant, deviceName, kNumber, decisionDate, decisionDescription, clearanceType, productCode, advisoryCommittee, state }] } + honest _meta. HONESTY: totalAvailable is openFDA's EXACT meta.results.total (skip/limit pagination via hasMore/nextOffset — never results.length); every scalar (dates included, decision_date is a YYYY-MM-DD string) is null-never-empty-string. ★A no-match query returns openFDA HTTP 404 NOT_FOUND ⇒ an HONEST EMPTY (returned:0, totalAvailable:0), NOT an error; a 400 syntax error ⇒ invalid_input surfacing openFDA's message; a 5xx ⇒ THROWS; a 200 non-JSON ⇒ schema_drift. The optional key rides ONLY the &api_key= query param — never logged or echoed.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
limitNoMax clearance records to return (default 25, max 100). Offset-paginated via skip.
stateNo2-letter US state/territory postal code filter (→ state), e.g. 'CA'. Validated ^[A-Za-z]{2}$.
kNumberNo510(k) clearance number (K-number) filter (→ k_number), e.g. 'K123456'. Matched as an escaped Lucene phrase.
applicantNoApplicant / manufacturer name filter (→ applicant), e.g. 'medtronic'. Matched as an escaped Lucene phrase.
deviceNameNoDevice name filter (→ device_name), e.g. 'catheter'. Matched as an escaped Lucene phrase.
productCodeNoFDA product code filter (→ product_code), e.g. 'DXN'. Matched as an escaped Lucene phrase.
clearanceTypeNo510(k) clearance type filter (→ clearance_type), e.g. 'Traditional', 'Special', 'Abbreviated'. Matched as an escaped Lucene phrase.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds extensive behavioral details: honesty policy (nulls never empty strings), error handling (404 returns empty, 400 returns invalid_input, 5xx throws, 200 non-JSON schema_drift), pagination (skip/limit, nextOffset), auth (optional key explanation, rate limits), and injection safety. No contradiction with annotations.

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 comprehensive but lengthy, with multiple paragraphs and details about error handling and auth that could be more succinct. While well-structured and front-loaded, it could be trimmed by about 30% without losing essential information.

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?

Given the complexity (8 parameters, no output schema), the description fully explains all filter parameters, return format (listing exact field names), pagination, error handling, and auth. It leaves no gaps in understanding how to invoke and interpret results.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds significant meaning beyond the schema: it explains the mapping from parameter names to openFDA field names (e.g., deviceName → device_name), validation rules (state regex, limit range), and how filters are safely assembled into Lucene search strings. This helps the agent use parameters correctly.

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 explicitly states it searches openFDA 510(k) device clearances, with specific verb 'Search' and resource 'device clearances'. It details the data source and fields returned, making the purpose unmistakable.

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?

No explicit guidance on when to use this tool versus siblings like openfda_enforcement or openfda_drug_approvals. The description focuses on how to use filters but does not provide decision criteria or exclusions, which leaves the agent without clear alternatives.

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

openfda_drug_approvalsA
Read-only

Search openFDA Drugs@FDA DRUG APPROVALS — FDA-approved drug applications (NDA/ANDA/BLA) with the sponsor, application number, each approved product (brand + generic/active-ingredient name, dosage form, route, marketing status), and the submission/approval history (openFDA /drug/drugsfda.json; api.fda.gov). Answers 'what drugs did sponsor X get approved, and which are still marketed' — pharma vendor product/approval intelligence. KEYLESS (an OPTIONAL free OPENFDA_API_KEY only RAISES the rate limit — keyless works at ~1000 requests/day; NEVER throws for a missing key; api_key_status lists every source's key requirement). Input: STRUCTURED filters — sponsorName (→sponsor_name), brandName (→products.brand_name), activeIngredient (→products.active_ingredients.name), applicationNumber (→application_number) — safely escaped into the openFDA search= Lucene string (NO raw passthrough — injection-safe), plus limit (1..100, default 25) and skip (offset ≥0). Returns { applications:[{ applicationNumber, sponsorName, products:[{ brandName, genericIngredients:[{name,strength}], dosageForm, route, marketingStatus }], submissions:[{ submissionType, submissionNumber, submissionStatus, submissionStatusDate, submissionClass }] }] } + honest _meta. HONESTY: totalAvailable is openFDA's EXACT meta.results.total (skip/limit pagination — never results.length); every scalar is null-never-empty-string; a 'Discontinued' marketingStatus is NOT an approval revocation (disclosed in _meta). ★A no-match query returns openFDA HTTP 404 NOT_FOUND ⇒ an HONEST EMPTY (returned:0/total:0), NOT an error; a 400 ⇒ invalid_input surfacing openFDA's message; a 5xx ⇒ THROWS; a 200 non-JSON ⇒ schema_drift. The optional key rides ONLY the &api_key= query param — never logged or echoed.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
limitNoMax application records to return (default 25, max 100). Offset-paginated via skip.
brandNameNoProduct brand name (→ products.brand_name), e.g. 'lipitor'. Matched as an escaped Lucene phrase.
sponsorNameNoSponsor / applicant company name (→ sponsor_name), e.g. 'pfizer'. Matched as an escaped Lucene phrase.
activeIngredientNoActive ingredient name (→ products.active_ingredients.name), e.g. 'atorvastatin calcium'. Matched as an escaped Lucene phrase.
applicationNumberNoFDA application number (→ application_number), e.g. 'NDA050347'. Matched as an escaped Lucene phrase.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes far beyond annotations (readOnlyHint=true, openWorldHint=true). It discloses key behaviors: how no-match queries return empty, not error; pagination honesty (totalAvailable is meta.results.total); error handling for 400, 5xx, 200 non-JSON; and that 'Discontinued' marketing status is not an approval revocation. This provides rich behavioral context.

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 detailed but verbose, spanning multiple paragraphs. While front-loaded with the main purpose, it includes extensive technical details that could be streamlined. Some sentences are dense but necessary.

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?

Given no output schema, the description fully specifies the return structure (applications array with nested fields) and includes edge cases (404 handling, honest pagination, error behavior). This makes it complete for an agent to understand behavior and expected output.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds value by explaining the mapping from parameter names to openFDA fields (e.g., sponsorName → sponsor_name) and emphasizes injection-safe Lucene escaping. This clarifies meaning beyond the schema alone.

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 searches openFDA Drugs@FDA DRUG APPROVALS, specifies the verb 'Search' and the resource, and answers specific questions like 'what drugs did sponsor X get approved'. It distinguishes from sibling tools (e.g., openfda_device_clearances, openfda_enforcement) by focusing on drug approvals.

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 explicitly states when to use: for pharma vendor product/approval intelligence. It mentions the optional API key and rate limits. However, it does not explicitly list cases when not to use or alternative tools, though siblings are clearly different.

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

openfda_enforcementA
Read-only

Search openFDA recall/enforcement records — drug/device/food product recalls with the recalling firm, product, reason, FDA classification (Class I/II/III), status, and geography (openFDA /{category}/enforcement.json; api.fda.gov). KEYLESS (an OPTIONAL free OPENFDA_API_KEY only RAISES the rate limit — keyless works at ~1000 requests/day; it NEVER throws for a missing key; get one at https://open.fda.gov/apis/authentication/; call api_key_status to see every source's key requirement). Input: category (drug|device|food, default drug), and STRUCTURED filters — firm (→recalling_firm), product (→product_description), reason (→reason_for_recall), classification (Class I|II|III), status (e.g. Ongoing/Terminated/Completed), state (2-letter, e.g. 'CA') — the tool safely assembles + escapes these into the openFDA search= Lucene string (NO raw passthrough — injection-safe), plus limit (1..100, default 25) and skip (offset ≥0). Returns { recalls:[{ recallingFirm, productDescription, reasonForRecall, classification, status, state, city, recallInitiationDate, recallNumber, voluntaryMandated, distributionPattern }] } + honest _meta. HONESTY: totalAvailable is openFDA's EXACT meta.results.total (skip/limit pagination via hasMore/nextOffset — never results.length); every scalar (dates included, recall_initiation_date is a YYYYMMDD string) is null-never-empty-string. ★A no-match query returns openFDA HTTP 404 NOT_FOUND ⇒ an HONEST EMPTY (returned:0, totalAvailable:0), NOT an error; a 400 syntax error ⇒ invalid_input surfacing openFDA's message; a 5xx ⇒ THROWS; a 200 non-JSON ⇒ schema_drift. The optional key rides ONLY the &api_key= query param — never logged or echoed.

ParametersJSON Schema
NameRequiredDescriptionDefault
firmNoRecalling firm name filter (→ recalling_firm), e.g. 'pfizer'. Matched as an escaped Lucene phrase.
skipNoRow offset for pagination (default 0). Page with _meta.pagination.nextOffset.
limitNoMax recall records to return (default 25, max 100). Offset-paginated via skip.
stateNo2-letter US state/territory postal code filter (→ state), e.g. 'CA'. Validated ^[A-Za-z]{2}$.
reasonNoReason-for-recall filter (→ reason_for_recall), e.g. 'contamination'. Matched as an escaped Lucene phrase.
statusNoRecall status filter (→ status), e.g. 'Ongoing', 'Terminated', 'Completed'.
productNoProduct description filter (→ product_description), e.g. 'insulin'. Matched as an escaped Lucene phrase.
categoryNoThe recall category (default 'drug'): 'drug', 'device', or 'food'. Selects the openFDA /{category}/enforcement endpoint.
classificationNoFDA recall classification filter: 'Class I' (most serious), 'Class II', or 'Class III'.

TDQS

A4.7/5.0
Behavior5/5

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

The description extensively covers behavioral traits beyond annotations: keyless operation, error handling (404→empty, 400→invalid_input, 5xx→throws, 200 non-JSON→schema_drift), honest pagination with totalAvailable exact, null-never-empty strings, and safe Lucene query construction. No contradiction with annotations (readOnlyHint=true, openWorldHint=true).

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 relatively long but well-structured with clear sections and bullet points. It front-loads the purpose and keyless info, then details parameters and error handling. Every sentence adds necessary information; minor room for trimming but overall efficient.

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?

Despite no output schema, the description fully documents the return structure (recalls array with fields, _meta with totalAvailable and pagination tokens) and all edge cases (empty response, errors). It is self-contained and complete for agent usage.

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

Parameters5/5

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

Schema coverage is 100%, and the description adds significant value by explaining the mapping of filters to openFDA fields (e.g., firm→recalling_firm), the default category, safe injection-free Lucene string assembly, and validations (e.g., state format). This goes well beyond the schema alone.

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 it searches openFDA recall/enforcement records, listing specific categories (drug/device/food) and data fields. It distinguishes itself from sibling tools like openfda_device_clearances and openfda_drug_approvals by focusing on enforcement/recalls.

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 explains how to use filters, pagination, keyless vs. keyed access, and error handling. It doesn't explicitly state when not to use this tool, but it's clear this is for enforcement data; alternatives are implied by sibling tool names. The honesty about rate limits and error cases is helpful.

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

opengov_list_governmentsA
Read-only

List the government portals on OpenGov Procurement (formerly ProcureNow) — the directory for opengov_search_solicitations (keyless; api.procurement.opengov.com). OpenGov Procurement hosts the live open-solicitation portals of 525+ US state/local governments (cities, counties, school & special districts across 42 states + DC). The WHOLE directory arrives in ONE keyless GET and is filtered client-side: state (2-letter), query (case-insensitive name substring); limit(1..200)/offset. Only ACTIVE, non-internal portals are returned. Output: { governments:[{ code, name, city, state, website }] } + honest _meta. Feed a result's code to opengov_search_solicitations. HONESTY: this consumes ONLY the anonymous endpoints the public portal itself calls (the official key-gated api-key API is NOT used) — genuinely keyless; totalAvailable is the EXACT filtered portal count (never the page length); a 429/5xx/timeout THROWS (never a fake empty); a non-array body ⇒ schema_drift.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPortals per page, 1..200, default 50.
queryNoCase-insensitive name substring filter (client-side), e.g. 'county', 'school'. Optional.
stateNo2-letter US state filter (client-side), e.g. 'CA', 'FL'. Optional.
offsetNo0-based offset; page with _meta.pagination.nextOffset. totalAvailable = exact filtered portal count.

TDQS

A4.5/5.0
Behavior5/5

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

The description provides extensive behavioral context beyond annotations: it is read-only (keyless GET), returns only active non-internal portals, filters client-side, uses anonymous endpoints, handles errors by throwing, and detects schema drift. It complements the readOnlyHint and openWorldHint annotations without contradiction.

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 front-loaded with the core purpose and is well-structured, covering filtering, output, usage with sibling, and honesty notes. Each sentence adds value, but it is relatively long and could be slightly more concise without losing essential information.

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?

The description compensates for the lack of an output schema by detailing the output structure (fields like code, name, city, state, website) and behavior of _meta and totalAvailable. It also covers error handling. However, it does not fully specify the _meta object fields besides pagination, and 'schema_drift' is mentioned but not defined.

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?

The input schema covers all 4 parameters (100% coverage), so baseline is 3. The description adds semantics: explains client-side filtering for state and query, limit range 1..200, offset 0-based, and that totalAvailable is the exact filtered count. This extra context raises the score to 4.

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 'List the government portals on OpenGov Procurement' and specifies the resource (directory for opengov_search_solicitations). It distinguishes from sibling tools by mentioning it provides the code needed for opengov_search_solicitations and by describing the client-side filtering behavior.

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 explains when to use the tool: to list active government portals, optionally filtered by state, query, limit, and offset. It notes the client-side filtering and the output format. However, it lacks explicit guidance on when not to use this tool or direct comparison with similar sibling tools like bonfire_list_organizations.

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

opengov_search_solicitationsA
Read-only

List a government's public solicitations on OpenGov Procurement (keyless; api.procurement.opengov.com, POST /project/list with the required publicView gate). Input governmentCode (the portal slug from opengov_list_governments, e.g. 'santacruzca', 'orlando', 'u-46'; REQUIRED), limit(1..100)/offset. Returns { governmentCode, solicitations:[{ id, title, solicitationNumber, status, type, department, releaseDate, proposalDeadline, contactName, link }] } + honest _meta. ★STATUS: status is surfaced VERBATIM — open = currently ACCEPTING responses; pending/evaluation/closed are ALSO returned (publicView shows all public projects), so filter status==='open' for live bids. link is the public portal page. HONESTY: totalAvailable = the API's count = the org's TOTAL public-project count (all statuses), NEVER the page length and NOT an open-only count (a note discloses this); pagination is the API's fixed page (offset is snapped to the page boundary, disclosed); a genuine no-match ⇒ complete:true/returned:0; a 429/5xx/timeout THROWS (never a fake empty); a non-array projects ⇒ schema_drift; a bad governmentCode ⇒ invalid_input pre-fetch. Genuinely keyless (the key-gated official API is NOT used).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoSolicitations per page, 1..100, default 50 (→ API page size).
offsetNo0-based offset (snapped to the API's fixed page boundary). Page with _meta.pagination.nextOffset.
governmentCodeYesThe OpenGov portal slug (from opengov_list_governments `code`), e.g. 'santacruzca', 'orlando', 'u-46'. REQUIRED. Lowercase alnum/hyphen; a bad slug ⇒ invalid_input pre-fetch.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint), the description adds rich behavioral details: it explains the `status` field is surfaced verbatim, the `link` field points to the public portal, the `totalAvailable` (count) is the org's total public project count, pagination behavior (offset snapped to page boundary), error handling (429/5xx throws, bad governmentCode triggers invalid_input pre-fetch), and ensures trustworthiness. This goes far beyond the minimal annotation information.

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 relatively long but well-structured with clear sections, line breaks, and emphasis (e.g., ★STATUS, HONESTY). While every sentence earns its place, some redundancy could be trimmed, but the level of detail justifies the length. The structure aids readability.

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?

Given the tool's complexity (no output schema, many edge cases), the description covers the return structure (governmentCode, solicitations array with fields, _meta), error conditions, and honest behavior. It fully accounts for what the agent needs to use the tool correctly and interpret results.

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?

The schema descriptions cover all parameters (100% coverage). The description adds extra value by specifying that governmentCode comes from opengov_list_governments, that limit defaults to 50 and offset is snapped to the API's page boundary, and mentioning _meta.pagination.nextOffset for pagination. This enhances understanding beyond the raw schema.

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

Purpose5/5

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

The description clearly states it lists public solicitations on OpenGov Procurement, specifying the verb 'List', the resource 'public solicitations', and includes the endpoint details, required parameters, and return structure. It distinguishes itself from sibling tools like opengov_list_governments (which lists governments) and bonfire_search_opportunities (different platform).

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

Usage Guidelines4/5

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

The description provides explicit usage guidance: governmentCode is required, sourced from opengov_list_governments, and explains limit/offset parameters. It also advises filtering status='open' for live bids and explains the significance of different statuses. It could be clearer about when not to use this tool versus alternatives, but it does give context for use.

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

regulations_get_docketA
Read-only

Fetch ONE Regulations.gov docket by id via /v4/dockets/{docketId} (api.data.gov keyed; DATA_GOV_API_KEY or DEMO_KEY) — the detail view where rin lives. Input docketId (e.g. 'BLM-2026-0001'; the ONLY path-segment value, charclass-validated — a bad id ⇒ invalid_input, 0 fetch). Returns { docket:{ docketId, title, agencyId, docketType, rin, dkAbstract, keywords, program, shortTitle, effectiveDate, modifyDate, objectId, id } } + single-record _meta (returned:1, totalAvailable:null, complete:true). HONESTY: rin (Regulatory Identifier Number) is the cross-source JOIN KEY to the Federal Register (fed_register_search_documents) and the Unified Agenda — null-when-absent (never '', e.g. many Nonrulemaking dockets have no assigned RIN), which is NOT a join failure. A nonexistent id ⇒ not_found (or schema_drift if the API returns a 200 error-envelope) — never a fabricated docket. DEMO_KEY ~10 req/hr; set DATA_GOV_API_KEY for 1000/hr.

ParametersJSON Schema
NameRequiredDescriptionDefault
docketIdYesThe docket id — the ONLY path-segment value, charclass-validated (rejects '../', '%2F', spaces, pure-dot) — e.g. 'BLM-2026-0001', 'TREAS-FINCEN-2008-0008'. A bad id ⇒ invalid_input (0 fetch); a nonexistent id ⇒ not_found (never a fabricated docket).

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint), the description discloses API key requirements and rate limits, behavior on bad IDs (invalid_input, 0 fetch), nonexistent IDs (not_found), and the possibility of null RIN. It also explains the return structure and meta fields. No contradiction with annotations.

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 front-loaded with the core purpose and includes organized sections (HONESTY, error handling). It is fairly long but all details are relevant. Could be slightly trimmed without losing information.

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 single-parameter tool with no output schema, the description thoroughly covers return fields, error cases, authentication, and cross-tool join context. It leaves no major gaps in understanding what the tool does and how to interpret results.

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

Parameters3/5

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

The input schema already provides 100% coverage with a detailed description for docketId. The tool description adds an example and validation info, but this is marginal additional value beyond the schema. Baseline of 3 is appropriate.

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 verb 'Fetch' and the resource 'ONE Regulations.gov docket by id', specifying the endpoint '/v4/dockets/{docketId}'. It highlights that the detail view contains the 'rin' field. This differentiates it from sibling tools like regulations_search_dockets which would be used for searching or listing dockets.

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 explains the tool's purpose for fetching a single docket and provides cross-source join context for 'rin'. It mentions API key rate limits and error handling. However, it does not explicitly state when to use this tool over alternatives like regulations_search_dockets.

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

regulations_search_commentsA
Read-only

Search Regulations.gov public COMMENTS on rulemakings — the killer B2G dataset (who is lobbying which rule). Same JSON:API envelope + input shape as regulations_search_documents (searchTerm/query, agencyId, docketId, postedDateGe/Le, sort, pageNumber 1..40, pageSize 5..250) against /v4/comments. Returns { comments:[{ id, documentType, title, agencyId, docketId, postedDate, objectId }] } + honest _meta (same totalElements-exact total + 40-page/10,000-record ceiling handling as documents).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort order (default '-postedDate'). Live-verified set: -postedDate/postedDate/-lastModifiedDate/lastModifiedDate/-commentEndDate (non-exhaustive).
queryNoAlias for `searchTerm` (either is accepted; both feed filter[searchTerm]).
agencyIdNoFilter by posting agency acronym (filter[agencyId]), e.g. 'EPA', 'FDA'.
docketIdNoFilter by docket id (filter[docketId]), e.g. 'EPA-HQ-OAR-2021-0257'.
pageSizeNoRecords per page (page[size]), 5..250, default 25.
pageNumberNo1-based page number, 1..40 (HARD cap — page[number] max is 40; the reachable window is 40×pageSize ≤ 10,000 records).
searchTermNoFull-text search term (filter[searchTerm]), e.g. 'artificial intelligence'.
documentTypeNoFilter by document type (documents only): Rule / Proposed Rule / Notice / Supporting & Related Material / Other.
postedDateGeNoPosted on/after this date, YYYY-MM-DD (filter[postedDate][ge]).
postedDateLeNoPosted on/before this date, YYYY-MM-DD (filter[postedDate][le]).
withinCommentPeriodNotrue ⇒ only documents currently open for comment (documents only; filter[withinCommentPeriod]).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint. The description adds behavioral details such as the same JSON:API envelope, return shape with fields, pagination ceiling (40 pages / 10,000 records), and that totalElements is exact. No contradictions with 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 a single, front-loaded sentence that efficiently conveys the purpose, input shape, output shape, and important constraints (ceiling, totalElements). Every part adds value without redundancy.

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?

Despite lacking an output schema, the description explicitly lists the return fields and meta structure, including the pagination limit. This is sufficient for an agent to understand what the tool returns and how to use it.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description adds minimal new info: it notes that 'query' is an alias for 'searchTerm' and mentions the sort set is 'live-verified' and 'non-exhaustive'. However, most parameter details are already in the schema.

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

Purpose5/5

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

The description clearly identifies the tool as searching Regulations.gov public comments, using specific verb 'Search', resource 'COMMENTS', and distinguishes from sibling 'regulations_search_documents' by noting it's the same input shape but for comments. It also states 'killer B2G dataset', providing context.

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 mentions that the input shape is the same as 'regulations_search_documents', implying a differentiation from that sibling, and notes the endpoint '/v4/comments'. However, it does not explicitly state when to use this tool versus alternatives or when not to use it.

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

regulations_search_docketsA
Read-only

Search Regulations.gov DOCKETS — the rulemaking/nonrulemaking CONTAINER that groups every document + comment under one regulatory action (api.data.gov keyed; DATA_GOV_API_KEY or the shared DEMO_KEY). Input searchTerm/query, filters (agencyId, docketType Rulemaking/Nonrulemaking, lastModifiedDateGe/Le YYYY-MM-DD), sort (def -lastModifiedDate), limit (1..250, def 20), pageNumber (1..40 HARD cap). Returns { dockets:[{ docketId, title, agencyId, docketType, lastModifiedDate, objectId, id }] } + honest _meta. HONESTY: totalAvailable = meta.totalElements (the EXACT real total, ~277k), NOT the capped totalPages (a 40 sentinel — deriving a total from totalPages lies); page[number] is hard-capped at 40 (10,000-record ceiling) — at the ceiling hasMore stays true but nextOffset is null + a note on how to reach the rest (narrow filters). The API's page[size] floor is 5, so a limit<5 fetches 5 and returns the first limit rows client-side (disclosed; totalAvailable stays exact). NOTE: rin is NULL in list rows — call regulations_get_docket for a docket's rin. DEMO_KEY ~10 req/hr (every call, incl. errors, decrements) — set DATA_GOV_API_KEY for 1000/hr. Genuine-empty ⇒ complete:true/total:0; outage/4xx/429 THROWS (never a fake empty).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort order (default '-lastModifiedDate'). Set: -lastModifiedDate/lastModifiedDate/title/-title (first two DEMO_KEY-verified).
limitNoRequested rows, 1..250, default 20. NOTE: the API's page[size] floor is 5 — a limit<5 fetches page[size]=5 upstream and returns the first `limit` rows client-side (disclosed in _meta.notes); totalAvailable stays the EXACT server total.
queryNoAlias for `searchTerm` (either is accepted; both feed filter[searchTerm]).
agencyIdNoFilter by owning agency acronym (filter[agencyId]), e.g. 'EPA', 'BLM', 'TREAS-FINCEN'.
docketTypeNoFilter by docket type: Rulemaking / Nonrulemaking (filter[docketType]).
pageNumberNo1-based page number, 1..40 (HARD cap — page[number] max is 40; the reachable window is 40×page[size] ≤ 10,000 records).
searchTermNoFull-text search term (filter[searchTerm]) over docket title/abstract, e.g. 'endangered species'.
lastModifiedDateGeNoDocket last modified on/after this date, YYYY-MM-DD (filter[lastModifiedDate][ge]).
lastModifiedDateLeNoDocket last modified on/before this date, YYYY-MM-DD (filter[lastModifiedDate][le]).

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the annotations (readOnlyHint, openWorldHint) by detailing pagination caps (40 pages, 10,000 records), the honesty of totalAvailable vs totalPages sentinel, the page[size] floor of 5 behavior, rate limits for DEMO_KEY vs API_KEY, and error handling (genuine-empty vs throws). No contradictions with annotations.

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 paragraph but is front-loaded with purpose and logically organized by parameters, honesty, rate limits, and error handling. It is dense but each sentence contributes essential information. Could be slightly more structured, but it is appropriate for the complexity.

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?

Given the 9 parameters, no output schema, and numerous siblings, the description is comprehensive: it covers how to use, edge cases (page cap, limit floor), behavior of meta fields, rate limits, and error conditions. It also describes the return shape sufficiently for an agent to interpret results.

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

Parameters5/5

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

With 100% schema description coverage, the baseline is 3, but the description adds significant meaning: explains that 'query' and 'searchTerm' are aliases, gives example values like 'endangered species', describes filter mappings (e.g., filter[agencyId]), explains sort verification, and details the limit floor behavior. This adds value beyond the schema.

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

Purpose5/5

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

The description starts with 'Search Regulations.gov DOCKETS' and explains that dockets are containers for documents and comments, clearly identifying the verb and resource. It distinguishes from siblings like regulations_search_documents and regulations_search_comments by specifying the object type.

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 API key requirements (DEMO_KEY vs DATA_GOV_API_KEY) and explains the pagination cap and the need to narrow filters to reach beyond. It notes that 'rin' is null in list rows and suggests using regulations_get_docket for that field, providing guidance on when to use an alternative. However, it does not explicitly contrast with other search tools.

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

regulations_search_documentsA
Read-only

Search Regulations.gov rulemaking DOCUMENTS (rules, proposed rules, notices) — the flagship of the api.data.gov keyed source (JSON:API; DATA_GOV_API_KEY or the shared DEMO_KEY). Input searchTerm/query, filters (agencyId, docketId, documentType, withinCommentPeriod, postedDateGe/Le YYYY-MM-DD), sort (def -postedDate), pageNumber (1..40 HARD cap), pageSize (5..250, def 25). Returns { documents:[{ id, documentType, title, agencyId, docketId, postedDate, commentEndDate, openForComment, withinCommentPeriod, frDocNum, objectId }] } + honest _meta. HONESTY: totalAvailable = meta.totalElements (the EXACT real total, ~millions), NOT the capped totalPages; page[number] is hard-capped at 40 (10,000-record ceiling) — at the ceiling hasMore stays true but nextOffset is null + a note says how to reach the rest (narrow filters / seek by lastModifiedDate). Genuine-empty ⇒ complete:true/total:0; an outage/4xx THROWS (never a fake empty).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort order (default '-postedDate'). Live-verified set: -postedDate/postedDate/-lastModifiedDate/lastModifiedDate/-commentEndDate (non-exhaustive).
queryNoAlias for `searchTerm` (either is accepted; both feed filter[searchTerm]).
agencyIdNoFilter by posting agency acronym (filter[agencyId]), e.g. 'EPA', 'FDA'.
docketIdNoFilter by docket id (filter[docketId]), e.g. 'EPA-HQ-OAR-2021-0257'.
pageSizeNoRecords per page (page[size]), 5..250, default 25.
pageNumberNo1-based page number, 1..40 (HARD cap — page[number] max is 40; the reachable window is 40×pageSize ≤ 10,000 records).
searchTermNoFull-text search term (filter[searchTerm]), e.g. 'artificial intelligence'.
documentTypeNoFilter by document type (documents only): Rule / Proposed Rule / Notice / Supporting & Related Material / Other.
postedDateGeNoPosted on/after this date, YYYY-MM-DD (filter[postedDate][ge]).
postedDateLeNoPosted on/before this date, YYYY-MM-DD (filter[postedDate][le]).
withinCommentPeriodNotrue ⇒ only documents currently open for comment (documents only; filter[withinCommentPeriod]).

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond the readOnlyHint and openWorldHint annotations: pagination behavior (hard cap, ceiling note), honesty of totalAvailable vs capped totalPages, error handling (genuine-empty vs outage/4xx throws), and how to reach more records. No contradiction with annotations.

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 relatively long but every sentence earns its place by providing critical usage information. It is front-loaded with the core purpose and then systematically covers parameters, pagination, and error behavior. Minor redundancy (e.g., mentioning 'flagship' is not essential) could be trimmed, but overall it is well-structured and efficient.

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?

Given no output schema, the description explicitly documents the return structure (documents array with fields like id, documentType, title, etc.) and the meta object behavior (totalElements as exact total). It also covers all parameters, pagination limits, and error states (genuine-empty vs outage). This is comprehensive for a complex search tool.

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

Parameters5/5

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

With 100% schema description coverage, the baseline is 3, but this description adds significant value: it clarifies the relationship between query and searchTerm (aliases), explains sort options (default, live-verified set), describes pageNumber hard cap as 'HARD cap', details date format (YYYY-MM-DD), and interprets withinCommentPeriod as 'documents only'. This goes well beyond the schema.

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

Purpose5/5

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

The description starts with 'Search Regulations.gov rulemaking DOCUMENTS (rules, proposed rules, notices)' which uses a specific verb and resource, and immediately distinguishes from sibling tools like regulations_search_comments (for comments) and regulations_search_dockets (for dockets). The explicit enumeration of document types ensures clear purpose.

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 explains when to use this tool (search for rulemaking documents) and provides important usage constraints: pageNumber hard cap at 40, pageSize range, and alternative strategies (narrow filters / seek by lastModifiedDate) when the ceiling is reached. It could be more explicit about when to prefer sibling tools, but the context is clear enough.

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

sam_attachment_urlA
Read-only

Build the public download URL for an attachment resourceId. The URL returns a 303 redirect to a signed S3 URL — fetch with redirect:'follow' to get the file bytes.

ParametersJSON Schema
NameRequiredDescriptionDefault
resourceIdYesResource id from sam_get_opportunity → resourceLinks (URL-tail hex)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds the critical behavior of returning a 303 redirect to a signed S3 URL, and instructs how to follow it. No contradictions.

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-load the purpose and immediately provide essential behavioral guidance. No unnecessary words.

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

Completeness5/5

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

Given the low complexity (one parameter, no output schema), the description fully addresses purpose, behavior, and usage instruction. It explains the redirect and gives a practical fetch hint.

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 covers 100% of parameters with a description for resourceId. The tool description does not add any extra meaning beyond the schema's explanation of where the resource ID comes from.

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 verb 'Build' and the resource 'public download URL for an attachment resourceId'. It distinguishes from sibling tools like sam_fetch_attachment_text and sam_get_opportunity which handle content retrieval or data display.

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 explains the redirect behavior and advises 'redirect:'follow' to get file bytes', providing clear usage context. It does not explicitly state when not to use or name alternatives, but the purpose is self-contained.

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

sam_check_exclusionsA
Read-only

Keyless SAM debarment/exclusion screening. Screen a firm or individual by name (query) and/or UEI/CAGE against the SAM exclusions index (FAPIIS). Returns excluded (true iff ≥1 ACTIVE matching record), matchCount, and per-record { name, classification, uei, cage, excludingAgency, exclusionType, exclusionProgram, isActive, activation/terminationDate, samFapiisUrl }. CRITICAL: an EMPTY result means 'no matching exclusion under these terms' — it is NOT proof of general responsibility (stated in _meta.notes). A name match is not identity-proof; verify the UEI/CAGE + dates against the FAPIIS record. Requires at least one of query/uei/cage.

ParametersJSON Schema
NameRequiredDescriptionDefault
ueiNoSAM UEI to match. Used as the text query when it is the sole selector; post-filtered against results when combined with a name query.
cageNoCAGE code to match (post-filtered against results, or used as the text query when sole).
pageNo0-based page index (default 0).
sizeNoPage size (default 25, max 100).
queryNoFirm or individual name to screen (drives the server-side exclusions text search). Provide at least one of query/uei/cage.
activeOnlyNoOnly currently-active exclusions (default true). false includes terminated exclusions.
classificationNoFilter by excluded-party classification (default 'any').

TDQS

A4.6/5.0
Behavior5/5

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

Annotations 'readOnlyHint' and 'openWorldHint' are present, and the description significantly expands on them by explaining the meaning of empty results, the need for verification, and the caveat about name matches. No contradictions.

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 dense but not verbose. Every sentence adds value. Could be slightly better structured (e.g., bullet points for caveats), but it remains concise and front-loaded.

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?

Given no output schema, the description fully describes the return structure (excluded, matchCount, per-record fields) and includes interpretation notes. Parameters are covered in schema and description. The tool's purpose and limitations are well-communicated.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description goes beyond by explaining interaction rules ('post-filtered when combined with name query'), requiring at least one parameter, and clarifying the behavior of 'activeOnly' and 'classification'. This adds meaningful value.

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 action ('screen'), the target ('firm or individual'), the data source ('SAM exclusions index (FAPIIS)'), and the input methods (name/UEI/CAGE). It is specific and distinct from sibling screening tools like 'sam_integrity_lookup' or 'ofac_screen_entity'.

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

Usage Guidelines4/5

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

The description provides clear context on when to use this tool (for debarment/exclusion screening) and critical interpretation guidance (empty result ≠ general responsibility, name match not identity-proof). It does not explicitly list when not to use or compare to alternatives, but the context is strong.

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

sam_fetch_attachment_textA
Read-only

Extract the TEXT of a SAM notice attachment (the actual RFP / SOW / Q&A / wage tables) by its download URL — so an AI can read the real solicitation, not just its metadata. Give it a sam_get_opportunity attachments[].url (resourceLinks). Keyless. Handles PDF (via pdfjs) + text/HTML; returns { format, text, pages, filename, sizeBytes, truncated, extracted }. HONEST: a DOCX / binary that can't be read keyless returns text:null + a note (never fabricated); a corrupt/encrypted PDF returns text:null + an extractionError note (never a crash); a DOWN fetch throws a retryable upstream_unavailable (never empty text); a 404 throws not_found. Only sam.gov / api.sam.gov URLs are fetched (SSRF hygiene). maxChars caps the text (default 200000) and truncation is disclosed.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesSAM attachment download URL from sam_get_opportunity → attachments[].url / resourceLinks (https://sam.gov/api/prod/opps/v3/opportunities/resources/files/{id}/download). Must be a sam.gov / api.sam.gov host.
maxCharsNoCap on returned text characters (default 200000, max 500000). Truncation is disclosed in _meta (truncated:true).

TDQS

A4.7/5.0
Behavior5/5

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

Extensively discloses behavior: handles PDF via pdfjs and text/HTML, returns structure with key fields, handles errors (corrupt/encrypted PDF, DOCX/binary, fetch failures, 404), SSRF hygiene, and truncation disclosure. This goes far beyond the readOnlyHint annotation.

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?

Single dense paragraph, front-loaded with purpose, no fluff. Every sentence adds essential information about behavior or constraints.

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?

Despite no output schema, description fully explains returned fields (format, text, pages, etc.) and error-handling behavior. Addresses edge cases and constraints (SSRF, truncation). Complete 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.

Parameters4/5

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

Schema has 100% parameter description coverage. Description adds important context: url must come from sam_get_opportunity → resourceLinks, maxChars default and max, and that truncation is disclosed. Adds modest value beyond schema.

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

Purpose5/5

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

Clearly states it extracts text from a SAM notice attachment, specifies input type (download URL), and distinguishes from metadata-only tools like sam_get_opportunity. Verb 'Extract the TEXT' is specific and actionable.

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?

Describes when to use: to read the real solicitation instead of metadata. Implies use after sam_get_opportunity. Does not explicitly mention when not to use or list alternatives, but context is clear enough.

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

sam_fetch_descriptionA
Read-only

Return the full description / RFP body text for a notice as plain text. Useful when sam_get_opportunity returned a description URL instead of inline body, or for an LLM-friendly text dump.

ParametersJSON Schema
NameRequiredDescriptionDefault
noticeIdYes32-char hex notice id

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description adds limited behavioral context beyond specifying the output is plain text. It does not disclose error handling or rate limits, but given the safe read-only nature, this is adequate.

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

Conciseness5/5

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

The description is two concise sentences, front-loaded with the purpose, and every word provides value. No unnecessary information.

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

Completeness5/5

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

For a simple tool with one parameter and no output schema, the description fully covers purpose, use case, and output type. No additional explanation is needed.

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

Parameters3/5

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

The input schema has 100% coverage with a clear description for noticeId ('32-char hex notice id'). The tool description does not add any additional meaning for the parameter beyond the schema, so baseline 3 is appropriate.

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 explicitly states the tool returns the full description/RFP body text as plain text for a notice, and distinguishes from the sibling tool sam_get_opportunity by addressing the case where that tool returns a URL instead of inline body.

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

Usage Guidelines4/5

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

The description provides clear context for when to use: when sam_get_opportunity returns a URL instead of inline body, or for an LLM-friendly text dump. It implies alternatives and usage scenarios but does not explicitly state when not to use.

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

sam_get_opportunityA
Read-only

Fetch full detail for a single SAM.gov notice by 32-char hex noticeId. Returns title, agency, solicitation #, POCs, response deadline, attachments (with download URLs), inline description body. Call BEFORE drafting bid/no-bid or compliance work.

ParametersJSON Schema
NameRequiredDescriptionDefault
noticeIdYes32-char hex notice id

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. Description adds detail on what is returned (title, POCs, attachments, etc.) and the action is clearly read-only. No contradictions.

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

Conciseness5/5

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

Two concise sentences: first covers purpose and return fields, second covers when to use. Front-loaded with verb and resource. No superfluous words.

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

Completeness5/5

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

For a simple get-by-ID tool, description covers input format, output fields, and usage context. No output schema, but list of returned fields is sufficient. Agent can correctly select and invoke.

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

Parameters3/5

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

The sole parameter noticeId is described both in the schema and the description as '32-char hex notice id'. Schema coverage is 100%, so description adds no new semantic beyond what schema provides.

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

Purpose5/5

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

The description clearly states the verb 'Fetch' and the resource 'full detail for a single SAM.gov notice', listing key fields returned. It distinguishes from sibling search tools (e.g., sam_search_opportunities) by specifying it is for a single notice by ID.

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

Usage Guidelines4/5

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

Explicitly states 'Call BEFORE drafting bid/no-bid or compliance work', providing clear usage context. Does not explicitly exclude alternatives, but the command is strong enough to guide selection.

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

sam_get_wage_ratesA
Read-only

Return the prevailing-wage + fringe/H&W rate table for a specific wage determination, PARSED from its plain-text document (SAM exposes no structured rate JSON), plus the Executive-Order minimum-wage floor. Distinguishes SCA (WD-wide Health & Welfare) vs DBA (per-craft fringe). Always returns parseConfidence and supports format:'parsed'|'raw'|'both' so you can read the raw text when parsing is low-confidence. Resolves the latest active revision via /history when revision is omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNo'parsed' (structured rates, default), 'raw' (the full document text), or 'both'. Use 'raw'/'both' when parseConfidence is low.
coverageNoOptional hint (sca|dba) to disambiguate the parser; inferred otherwise.
revisionNoRevision number. Omit to resolve the latest ACTIVE revision via /history.
referenceYesfullReferenceNumber of the wage determination (e.g. '2015-4093' for SCA, 'IA20260028' for DBA) from sam_search_wage_determinations.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds valuable behavioral details: it always returns parseConfidence, supports three format options, distinguishes SCA vs DBA, and resolves latest revision via /history. This goes beyond what annotations provide, though it does not cover edge cases like invalid references.

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 a concise paragraph of three sentences, front-loaded with the main purpose. Every sentence adds value: parsing context, SCA/DBA distinction, parseConfidence, format options, and revision resolution. No redundant or unnecessary content.

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?

The tool has no output schema, but the description provides a high-level picture of what is returned (rate table, parseConfidence, SCA vs DBA). It also explains how to handle low-confidence parsing via raw output. However, it lacks detail on the exact structure of the parsed rates and error handling for invalid references. Overall, it is sufficiently complete for an agent.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial meaning beyond the schema. It explains the effect of omitting revision (resolves latest active revision), provides real-world examples for reference (e.g., '2015-4093'), clarifies the default for format ('parsed'), and advises when to use raw format (low parseConfidence).

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

Purpose5/5

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

The description uses a specific verb 'Return' and clearly identifies the resource: 'prevailing-wage + fringe/H&W rate table for a specific wage determination'. It also distinguishes key subtypes (SCA vs DBA) and mentions features like parseConfidence and format options, making it highly specific and unambiguous.

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 provides usage guidance for parameters (e.g., omitting revision resolves latest active revision, using raw format when confidence is low) but does not explicitly state when to use this tool versus sibling tools like sam_search_wage_determinations or gsa_benchmark_labor_rates. The usage context is implied but lacks exclusion criteria.

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

sam_integrity_lookupA
Read-only

Keyless ONE-CALL integrity screen — 'any integrity red flags on this entity?'. Composes the keyless government-wide EXCLUSION verdict (via sam_check_exclusions) with an honest pointer to the FAPIIS / Responsibility-Qualification record. Requires at least one of uei/cage/name (uei preferred; name maps to the exclusions text search). Returns { entity, exclusions:{excluded,activeCount,records}, fapiisRecords, fapiisUrl, integrityFlag }. integrityFlag is 'excluded' when ≥1 ACTIVE matching exclusion is found, else 'review_fapiis' — it NEVER returns 'clear' keylessly, because FAPIIS records (terminations for default/cause, non-responsibility determinations, self-reported criminal/civil/administrative proceedings) have NO keyless machine API, so absence of an exclusion is NOT proof of integrity. fapiisRecords is ALWAYS null (never faked; record-level retrieval needs an optional SAM Entity key) with _meta.fieldsUnavailable:['fapiisRecords']; fapiisUrl deep-links the viewable SAM page. An upstream exclusions failure surfaces as the classified error, never a fake clearance.

ParametersJSON Schema
NameRequiredDescriptionDefault
ueiNoSAM UEI of the entity to screen (PREFERRED — most precise). Provide at least one of uei/cage/name.
cageNoCAGE code of the entity to screen.
nameNoLegal entity name to screen (drives the keyless exclusions text search; normalized-name gated). Provide at least one of uei/cage/name.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint=true annotation, the description details the integrityFlag values ('excluded' vs 'review_fapiis'), that fapiisRecords is always null with a _meta.fieldsUnavailable field, and that upstream failure surfaces as an error, not a fake clearance.

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 concise yet comprehensive, front-loading the core purpose and parameter requirements, then systematically explaining return values and caveats. Every sentence adds necessary information without redundancy.

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?

Despite the absence of an output schema, the description fully documents the return object structure including nested fields, edge cases (null records, error handling), and the meaning of integrityFlag. This makes the tool's behavior completely transparent.

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?

The input schema already provides 100% coverage with descriptions for each parameter. The tool description adds value by noting that uei is preferred and that name drives an exclusions text search, providing practical guidance beyond the schema.

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

Purpose5/5

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

The description clearly defines the tool as a 'Keyless ONE-CALL integrity screen' that checks for exclusion verdicts and provides a pointer to FAPIIS records. It distinguishes itself from siblings by specifying it composes sam_check_exclusions and never returns a false 'clear'.

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

Usage Guidelines5/5

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

Explicitly states required parameters (at least one of uei/cage/name, with uei preferred) and explains when to use it (integrity screening). It also clarifies limitations: never returns 'clear' keylessly, and FAPIIS records are unavailable without a key.

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

sam_lookup_notice_fieldsA
Read-only

BATCH-complete a sam_search_opportunities page in ONE call from the GSA daily bulk CSV (keyless). The keyless HAL list endpoint NULLS each result's naics/setAside/place-of-performance/responseDeadline/type; this tool returns those fields for 1..100 noticeIds at once (naicsCode, setAside + setAsideCode, popState/popCity/popZip/popCountry, responseDeadline, type, active, title) from a cached on-disk CSV index, instead of one sam_get_opportunity detail call per notice. OFF BY DEFAULT (no forced 226 MB download): enable by setting SAM_GOV_CSV_CACHE (a cache dir) or SAM_GOV_ENABLE_CSV=1 — when disabled the tool returns data.enabled:false + a structured 'how to enable' note (never fake data, no network). HONEST: _meta carries the CSV last-modified + index build time (freshness), a noticeId absent from the current snapshot returns found:false + nulls with an explicit 'not in current CSV snapshot' disclosure (never faked), a cold first call discloses 'index warming', and a download/parse failure is a structured retryable error (never a silent empty). setAsideCode (e.g. 'SBA') matches sam_get_opportunity's setAside; the snapshot can lag live by up to ~24h — confirm real-time-critical fields with sam_get_opportunity.

ParametersJSON Schema
NameRequiredDescriptionDefault
noticeIdsYes1..100 32-char hex noticeIds (the ids returned by sam_search_opportunities) to enrich in ONE batch. Completes a whole search page's null naics/setAside/place-of-performance/deadline/type from the cached GSA daily CSV. OFF BY DEFAULT — enable by setting SAM_GOV_CSV_CACHE (a cache dir) or SAM_GOV_ENABLE_CSV=1.

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses all critical behaviors beyond annotations: off-by-default, honest error handling (no fake data), freshness meta, index warming, structured error messages, and 24h lag. Annotations already indicate readOnlyHint=true and openWorldHint=true, but the description adds substantial context about caching, failures, and return behavior.

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 relatively long but well-structured with clear sections (BATCH, OFF BY DEFAULT, HONEST). Every sentence adds value, though some repetition could be trimmed. The length is justified by the complexity of the tool's behavior.

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?

Given the tool's complexity (batch enrichment, caching, off-by-default), the description covers all necessary context: why it exists, how to enable, behavior when disabled, freshness, error handling, and limitations (24h lag). No output schema exists, but the description hints at returned fields. This is fully adequate for the agent to use correctly.

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?

The single parameter 'noticeIds' is fully described in the schema with 100% coverage, including constraints (1-100, 32-char hex). The description adds context about batch completion of a search page and the enrichment details, going beyond the schema. However, the schema already provides the essential constraints, so the description adds marginal value.

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 that this tool is a batch enrichment for notice IDs from a CSV cache, completing fields that are null in sam_search_opportunities results. It explicitly distinguishes from sam_get_opportunity by noting it avoids one-per-notice calls. The verb 'BATCH-complete' and resource 'a sam_search_opportunities page' are specific and unambiguous.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use (batch enrichment of a search page) and when not (real-time-critical fields should use sam_get_opportunity). It also details how to enable the tool (setting environment variables) and what happens when disabled. This clearly differentiates from siblings like sam_get_opportunity and sam_search_opportunities.

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

sam_lookup_organizationA
Read-only

Resolve a SAM.gov federal-organization id to its canonical fullParentPathName (e.g. 'VETERANS AFFAIRS, DEPARTMENT OF.VETERANS AFFAIRS, DEPARTMENT OF.245-NETWORK CONTRACT OFFICE 5'). Use when sam_get_opportunity returned only an organizationId.

ParametersJSON Schema
NameRequiredDescriptionDefault
organizationIdYesSAM.gov federal-organization id (numeric)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=true and openWorldHint=true, so safety is clear. The description adds behavioral context about the output format (fullParentPathName with example). No contradictions. A minor gap: it doesn't mention behavior on invalid IDs, but given low complexity and annotations, this is adequate.

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

Conciseness5/5

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

The description is two sentences, one for purpose and one for usage. It is front-loaded and concise with zero wasted words. Every sentence adds value.

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?

Given the tool's simplicity (one required parameter, no output schema), the description is complete. It explains what input is needed, what output to expect, and when to use it. No gaps for an agent to misuse.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameter is well-defined in the schema. The description does not add additional meaning beyond what the schema provides. Baseline 3 is appropriate.

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 resolves a SAM.gov federal-organization ID to its canonical fullParentPathName, providing a specific verb and resource. It distinguishes itself from sibling tools like sam_get_opportunity by specifying the use case.

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

Usage Guidelines5/5

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

The description explicitly says 'Use when sam_get_opportunity returned only an organizationId', providing clear guidance on when to use this tool and an alternative. This is explicit and helpful.

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

sam_search_opportunitiesA
Read-only

Search SAM.gov federal contracting opportunities (keyless HAL). Returns up to 50 active notices with title, agency, NAICS, noticeId. Use for discovery — narrow with NAICS / agency / set-aside / state.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
ncodeNoNAICS code, e.g. '541512'
queryNoFree-text title query
stateNoPlace-of-performance state, 2-letter, e.g. 'MD'
offsetNoPage offset into the result set (default 0).
setAsideNoSet-aside codes: SBA, 8A, HZS, SDVOSBC, WOSB, EDWOSB, VSA, VSS
organizationNameNoIssuing agency canonical name (e.g. 'Department of Veterans Affairs'). Use sam_lookup_organization or usas_lookup_agency to resolve abbreviations.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. Description adds value by noting keyless access, 50-result limit, active notices, and listed fields, which are behavioral traits not in 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?

Two sentences front-load purpose and key constraints (keyless, 50 results, up to date). No redundant or irrelevant words.

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

Completeness4/5

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

Tool has 7 parameters and no output schema. Description covers essential return info (fields, limit, active status) and filtering hints. Lacks mention of pagination (offset) but schema covers it. Adequate for basic use.

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

Parameters3/5

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

Schema coverage is 86% (6/7 params have descriptions). The description mentions narrowing by NAICS/agency/set-aside/state, aligning with parameters, but adds little beyond schema details. Baseline 3 is appropriate.

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 it searches SAM.gov federal contracting opportunities, specifies keyless HAL, return fields (title, agency, NAICS, noticeId), and limits to 50 active notices. This is a specific verb+resource with clear scope, distinguishing it from sibling tools like sam_get_opportunity or sam_search_shaping.

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

Usage Guidelines4/5

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

Explicitly states use for discovery and narrowing by NAICS/agency/set-aside/state. While it doesn't explicitly say when not to use, the guidance is clear and contextually sufficient given sibling variety.

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

sam_search_shapingA
Read-only

PRE-SOLICITATION shaping radar (keyless HAL). Surfaces Sources Sought / Presolicitation / Special Notices BEFORE the RFP exists — the free, real-time analogue of paid agency-forecast feeds. Closes the pre-solicitation lifecycle gap: catch a requirement while it's still shapeable (submit capabilities, influence NAICS/set-aside/PWS). Defaults to noticeType ['r','p','s']; opt into k/i/u for combined-synopsis / intent-to-bundle / J&A tells. Each notice carries noticeTypeCode (rank r/p over s), postedDate, responseDeadline + daysUntilResponse (null when no deadline — counted, not hidden), and a uiLink. HONEST KEYLESS LIMITS: naics/setAside/placeOfPerformance are null in the list rows (call sam_get_opportunity(noticeId) for those); and a responseDeadlineFrom/To window is applied CLIENT-SIDE over the fetched page (the feed ignores rdlfrom/rdlto) and disclosed in _meta. data.totalRecords is the TRUE server-side count for the type+facet filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 25, max 50).
ncodeNoNAICS code, e.g. '541512'
queryNoFree-text title query
stateNoPlace-of-performance state, 2-letter, e.g. 'MD'
setAsideNoSet-aside codes: SBA, 8A, HZS, SDVOSBC, WOSB, EDWOSB, VSA, VSS
activeOnlyNoOnly currently-active notices (default true).
noticeTypeNoPre-solicitation notice-type codes to include. r=Sources Sought, p=Presolicitation, s=Special Notice (the DEFAULT shaping window = ['r','p','s']); k=Combined Synopsis/Solicitation, i=Intent to Bundle, u=Justification (J&A) are opt-in adjacency/incumbent tells. Ranked r/p over s via noticeTypeCode.
organizationNameNoIssuing agency canonical name (e.g. 'Department of Veterans Affairs'). NOTE: the keyless endpoint has NO organization-name filter — it is sent best-effort and flagged in _meta.filtersDropped; filter client-side on the returned `agency`.
responseDeadlineToNoISO date upper bound for responseDeadline. APPLIED CLIENT-SIDE over the fetched page (see responseDeadlineFrom).
responseDeadlineFromNoISO date lower bound for responseDeadline. APPLIED CLIENT-SIDE over the fetched page (the keyless feed ignores rdlfrom/rdlto) — disclosed in _meta.filtersDropped. A notice with no deadline is excluded from a windowed query.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description discloses keyless limits: missing fields in list rows, client-side date filtering, and true server-side count. It also explains how responseDeadline windows are applied, providing valuable behavioral context.

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 dense but well-structured, starting with purpose, then key behavioral notes, parameter details, and limits. While slightly verbose given the tool's complexity, it is efficient and front-loaded with essential information.

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?

With no output schema, the description covers all critical output fields (noticeTypeCode, postedDate, responseDeadline, daysUntilResponse, uiLink) and edge cases (null deadlines). It also explains data.totalRecords and how to obtain full details via sam_get_opportunity.

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

Parameters5/5

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

Although input schema covers 100% of parameters, the description adds critical context: default noticeType (['r','p','s']), opt-in codes, and client-side filtering behavior for organizationName and responseDeadline. This significantly aids correct parameter usage.

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: it surfaces pre-solicitation notices (Sources Sought, Presolicitation, Special Notices) before an RFP exists. It uses specific verbs ('surfaces', 'catch') and distinguishes itself from paid feeds and sibling tools like sam_search_opportunities.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance (pre-solicitation shaping) and when-not-to (when NAICS/setAside/placeOfPerformance needed, use sam_get_opportunity). It also explains client-side filtering for responseDeadline and organizationName, offering clear alternatives.

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

sam_search_wage_determinationsA
Read-only

Find the Service Contract Act (SCA) or Davis-Bacon (DBA) wage determination(s) governing a locality (keyless SAM SGS). Filter by coverage (sca|dba), state (2-letter, server-side), county (client-side), or WD number/title. Returns the structured WD list; follow with sam_get_wage_rates to read the rate table. NOTE: query matches WD number/title only, NOT occupation.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo0-based page index (default 0).
limitNoPage size (default 20, max 50).
queryNoMatches the WD NUMBER/TITLE only — NOT occupation/job title (q=guard returns 0).
stateNo2-letter USPS state code (e.g. 'VA'), applied SERVER-SIDE. A full name is applied client-side instead.
countyNoCounty name (substring match), applied CLIENT-SIDE over the fetched page only (the API has no county filter).
coverageYesWhich wage-determination law: 'sca' (Service Contract Act — services) or 'dba' (Davis-Bacon Act — construction). 'dba' is normalized to the API's 'dbra' index.
activeOnlyNoOnly currently-active WDs (default true).
standardOnlyNoOnly standard (non-non-standard) WDs (default true).

TDQS

A4.7/5.0
Behavior5/5

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

The description goes beyond the 'readOnlyHint' and 'openWorldHint' annotations by detailing behavior: filters are applied server-side (state) or client-side (county) due to API limitations, and coverage 'dba' is normalized to 'dbra'. It explains the pagination defaults and the open-world nature of results.

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 concise (4 sentences) with a front-loaded purpose sentence, followed by filter details and a crucial note. Every sentence adds value, no redundancy.

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?

Given 8 parameters and no output schema, the description covers all parameters, explains API limitations, and provides usage sequence (follow with sam_get_wage_rates). It is complete for an effective search tool, addressing potential confusion.

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?

With 100% schema description coverage, the baseline is 3. The description adds significant value by explaining the client-side vs server-side behavior for state and county, the normalization of 'dba' to 'dbra', and reinforcing that 'query' only matches WD number/title. This clarifies parameter usage beyond the schema.

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

Purpose5/5

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

The description states it 'Find the Service Contract Act (SCA) or Davis-Bacon (DBA) wage determination(s) governing a locality (keyless SAM SGS).' It clearly defines the core action (searching wage determinations) and the specific resources (SCA/DBA). It distinguishes itself from the sibling tool 'sam_get_wage_rates' by noting the follow-up step.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool (to find wage determinations by locality) and includes a critical note that 'query matches WD number/title only, NOT occupation', preventing misuse. It also directs to use 'sam_get_wage_rates' to read the rate table. However, it does not explicitly state when not to use this tool over alternative search methods, but the sibling list includes many unrelated tools.

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

sba_size_standardA
Read-only

SBA small-business size standard for a 6-digit NAICS (keyless sba.gov naics.json). Answers 'is a firm SMALL for this NAICS?' — the gate for set-aside eligibility and for vetting a usas_search_teaming_partners candidate. Returns standardType (receipts | employees | assets [financial institutions] | receipts+assets), a normalized threshold (receipts/assets in DOLLARS — the dataset's $millions figure ×1,000,000; employees as a count), the unit, and any SBA footnote. HONESTY: the dataset carries no effective-date field, so the value is 'as published as of retrieval' (asOf) and _meta.notes flags that SBA adjusts standards periodically — re-verify at sba.gov for high-stakes eligibility. An unknown NAICS returns found:false (never a fabricated standard).

ParametersJSON Schema
NameRequiredDescriptionDefault
naicsYes6-digit NAICS code to look up the SBA small-business size standard for (e.g. '541512').

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond annotations: the dataset lacks an effective date, so the result is timestamped with asOf; it clearly states that SBA adjusts standards periodically and advises re-verification. It also ensures no fabricated results for unknown NAICS. Annotations (readOnlyHint, openWorldHint) are consistent and not contradicted.

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 informative and well-structured, front-loading the core purpose. It uses clear labeling like 'HONESTY:' to highlight caveats. While every sentence adds value, the description could be slightly more concise without losing essential details.

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?

Given no output schema, the description thoroughly explains the return fields (standardType, threshold, unit, footnote) and the honesty note about data freshness. It also covers error handling for unknown NAICS. This is complete for a simple lookup tool with one parameter.

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

Parameters3/5

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

The input schema covers 100% of parameters with a clear description of the naics parameter ('6-digit NAICS code'). The tool description adds minimal new meaning beyond the schema, merely restating the format. With high schema coverage, a baseline of 3 is appropriate.

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: to look up the SBA small-business size standard for a 6-digit NAICS, specifically answering 'is a firm SMALL for this NAICS?' and acting as a gate for set-aside eligibility and vetting teaming partners. This distinguishes it from sibling tools that deal with contracts, agencies, or other government data.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool (for set-aside eligibility and vetting candidates) and provides important caveats: the dataset has no effective-date field, so values are 'as of retrieval' and SBA adjusts standards periodically, recommending re-verification at sba.gov for high-stakes decisions. It also notes that unknown NAICS return found:false, avoiding fabricated results.

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

search_gov_domainsA
Read-only

Search the authoritative US .gov domain registry (CISA get.gov) — resolve which ORGANIZATION owns a .gov domain, enumerate federal agencies, and MAP SLED entities (state/county/city/school-district/special-district/tribal) for market targeting. Keyless. scope 'all' (federal + SLED, ~16k rows, default) | 'federal'. Filters (client-side over the published CSV): organization/domain/city (case-insensitive SUBSTRING), domainType (e.g. 'Federal - Executive', 'County', 'Tribal'), state (2-letter). Each row: domain, domainType, organization, suborganization, city, state. HONESTY: source is CISA's OFFICIAL registry published at github.com/cisagov/dotgov-data (authoritative first-party data, not a .gov API host — provenance disclosed in _meta); the registry has no query API so filtering is CLIENT-SIDE and totalAvailable is the EXACT match count; the 'Security contact email' column is intentionally EXCLUDED (org mailbox — this tool resolves organizations, not contacts); an outage/4xx THROWS (never a fake empty); a header-column rename ⇒ schema_drift.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity — case-insensitive SUBSTRING match.
limitNoRows per page, 1..500, default 50.
scopeNo'all' (federal + SLED: state/county/city/school-district/special-district/tribal, ~16k rows, DEFAULT) or 'federal' (federal-only, ~1.3k rows).
stateNo2-letter state/territory code — case-insensitive exact match (e.g. 'CA').
domainNoDomain name — case-insensitive SUBSTRING match (e.g. 'cdc.gov', 'irs').
offsetNo0-based row offset for pagination, default 0.
domainTypeNoDomain type — case-insensitive match (e.g. 'Federal - Executive', 'County', 'Tribal', 'State or territory', 'School district').
organizationNoOrganization name — case-insensitive SUBSTRING match (e.g. 'veterans', 'cybersecurity').

TDQS

A4.6/5.0
Behavior5/5

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

Annotations mark it as read-only and open-world, which is consistent. The description adds significant detail: client-side filtering over a CSV, exact match counts, exclusion of security contact emails, error behavior (throws on 4xx), and potential schema drift. This goes well beyond annotation hints.

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 well-structured, starting with a clear purpose statement. While it is relatively long, each sentence provides essential information (e.g., scope values, filter behavior, source honesty). It is efficient but could be slightly trimmed without losing clarity.

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?

Despite lacking an output schema, the description lists the fields returned per row. It covers data source, filtering mechanics, error handling, and schema drift. For an 8-parameter search tool with no required params, this is thorough and addresses likely questions.

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?

The input schema covers 100% of parameters with descriptions. The tool description reinforces these with examples (e.g., 'veterans' for organization, 'cdc.gov' for domain) and lists output fields (domain, domainType, etc.). This adds value, especially since there is no output schema.

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

Purpose5/5

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

The description specifies the tool searches the authoritative US .gov domain registry (CISA get.gov) to resolve organization ownership, enumerate federal agencies, and map SLED entities. The verb 'search' and resource are clear, and the tool is distinct from sibling tools that focus on contracts, awards, or other government data.

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 states when to use: for resolving domain ownership, enumerating federal agencies, and marketing targeting. It also clarifies that security contacts are excluded and that errors throw rather than returning empty results. Although no explicit alternatives are given, the tool's unique purpose makes this less necessary.

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

socrata_discover_datasetsA
Read-only

Find Socrata dataset 4x4 ids by keyword via the Socrata catalog (keyless, api.us.socrata.com). Input q (e.g. 'procurement', 'vendor payments'), optional domain (scope to one allowlisted portal; omit to search the whole allowlist), limit (≤100, def 20). Returns [{ id, name, description, domain, updatedAt, link }] + totalAvailable = the catalog resultSetSize. Feed a result's id to socrata_query as datasetId. NOTE: the federated catalog does not index every allowlisted host (e.g. USAC E-rate) — those stay queryable via socrata_query with a known 4x4.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesKeyword(s) to find datasets, e.g. 'procurement', 'vendor payments', 'checkbook'.
limitNoMax datasets to return, 1..100, default 20.
domainNoOptional: scope discovery to ONE allowlisted portal. Omit to search the whole allowlist. NOTE: the federated catalog does not index every host (e.g. USAC E-rate returns 0) — those remain queryable via socrata_query with a known 4x4.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description explains that the tool is keyless, uses a specific API, returns structured data with fields, and notes the limitation that not all allowlisted hosts are indexed.

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 information-dense and front-loaded with the main purpose, but the single paragraph structure could be slightly improved for readability; still concise and effective.

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?

The description explains return format (list of fields plus totalAvailable) and caveats about federated catalog, making it complete for a search tool with no output schema.

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

Parameters5/5

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

The description adds meaningful context to all three parameters: q provides examples, domain explains scoping and limitation, limit gives range and default. Schema coverage is 100% and description adds value beyond schema.

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

Purpose5/5

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

The description clearly states the tool finds Socrata dataset 4x4 ids by keyword, distinguishing from the sibling socrata_query tool by noting that discovered ids can be fed to socrata_query.

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

Usage Guidelines5/5

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

The description specifies required input q, optional domain and limit, and provides explicit guidance on when to use socrata_query instead (when federated catalog does not index a host).

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

socrata_queryA
Read-only

Query rows from an allowlisted Socrata/SODA open-data portal (keyless; ~a dozen US state portals + USAC E-rate on one identical API — state spend/checkbook/contract/vendor-payment datasets). Input domain (curated allowlist enum — the SSRF host guard), datasetId (4x4, from socrata_discover_datasets), optional SoQL select/where/order/q, limit (≤1000, def 100), offset, withTotal (def true). HONESTY: SODA's row response has no total, so a count(*) companion supplies an exact totalAvailable; if it fails the rows still return with totalAvailable:null + a note (hasMore is then inferred from page-fill, never a false complete). Genuine-empty ⇒ complete:true/total:0; an outage/400/404 THROWS (never a fake empty). Value fields are strings.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoOptional SoQL $q full-text search across the row.
limitNoRows per page ($limit), 1..1000, default 100.
orderNoOptional SoQL $order, e.g. 'amount DESC'.
whereNoOptional SoQL $where filter, e.g. "fiscal_year='2024' AND amount>1000". A bad column ⇒ upstream HTTP 400 ⇒ invalid_input (surfaced, never silent).
domainYesWhich allowlisted Socrata portal to query (curated .gov hosts + USAC E-rate .org; the SSRF host allowlist — no free host). e.g. data.ny.gov, data.texas.gov, data.wa.gov, opendata.usac.org.
offsetNo0-based row offset ($offset) for pagination, default 0.
selectNoOptional SoQL $select (column projection / aggregate), e.g. 'agency,SUM(amount)'.
datasetIdYesThe dataset's Socrata 4x4 id, e.g. 'kwxv-fwze' (from socrata_discover_datasets). Exactly [a-z0-9]{4}-[a-z0-9]{4} (9 chars; no surrounding whitespace).
withTotalNotrue (default) ⇒ issue a count(*) companion query so totalAvailable is exact. false ⇒ skip it (one fewer request); totalAvailable is null and a note discloses results may be truncated at $limit.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes beyond the annotations (readOnlyHint, openWorldHint) by detailing key behaviors: keyless access, honest total count handling (exact via count query or null with note on failure), error behavior (throws on outage/400/404, never fake empty), and that value fields are strings. This provides extensive behavioral context.

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 comprehensive yet efficiently structured: purpose first, then parameter details, then behavioral honesty note. While lengthy, every sentence adds essential value without redundancy. A slight trim could be possible, but it earns its length.

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

Completeness4/5

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

Given no output schema, the description covers response behavior thoroughly: row response format, total count mechanism, distinction between genuine empty and error, and value types. It also mentions the companion count query and pagination implications. Almost all necessary context is provided.

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

Parameters5/5

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

With 100% schema coverage, the baseline is 3, but the description adds significant value: explains domain as a curated allowlist enum (SSRF guard), datasetId format, each SoQL parameter (select, where, order, q) with examples, limit range (≤1000, default 100), offset, and withTotal behavior (default true, issues count query). This deep explanation compensates well.

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 queries rows from an allowlisted Socrata/SODA open-data portal, specifically for state spend/checkbook/contract/vendor-payment datasets. It distinguishes from the sibling tool socrata_discover_datasets which provides the required datasetId.

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 explains what inputs are needed (domain, datasetId, optional SoQL parameters) and mentions that datasetId comes from socrata_discover_datasets. It does not explicitly state when not to use the tool, but the specificity of the allowed portals and parameter details provides clear guidance.

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

tableau_view_csvA
Read-only

Fetch a curated US-government Tableau Server Guest view's COMPLETE CSV export (keyless) and page over it — a SLED transparency source (many state/local govs publish contracts / vendor-payment / checkbook data on a Guest-enabled Tableau Server; a worksheet view exports as CSV at {host}/t/{site}/views/{workbook}/{view}.csv?:embed=y, no login/key/cookie). First payload: mt_contracts_awarded = State of Montana (DOA) Contracts Awarded (~4,554 award records: '$ Awarded', 'Award Date', 'Event Type' (Invitation For Bid / RFP), 'Event#' solicitation number, 'Vendor Name', 'Agency'). Inputs: view (the allowlist ENUM — SSRF core, never a free host), limit(1..1000)/offset. Returns { view, columns:[…], rows:[{col:value…}] } + honest _meta. HONESTY: the CSV is the COMPLETE view export (Tableau returns ALL summary rows — NO server pagination), so totalAvailable = the true row count (NEVER a page length); limit/offset page it client-side; a round-number total is flagged as a possible Tableau export cap. Values are TRIMMED strings (an empty field ⇒ null, never 0/""); the content is preserved — amounts like "$5,879,590.00" are FORMATTED STRINGS, parse client-side. A 429/5xx/404/timeout THROWS; a gated/renamed view (200 sign-in HTML or an empty dashboard-container export) ⇒ schema_drift (a loud failure, NEVER a fake empty); a worksheet with a header but 0 data rows ⇒ honest empty. SSRF: fixed allowlist base + hostname assertion + redirect:error.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewYesThe curated Tableau Server Guest view (SSRF allowlist enum). 'mt_contracts_awarded' = State of Montana (DOA) Contracts Awarded (~4,554 award records: $ Awarded, Award Date, Event Type IFB/RFP, Event# solicitation, Vendor Name, Agency).
limitNoRows per page, 1..1000, default 50. The CSV is the complete view export; this pages over it client-side.
offsetNo0-based offset; page with _meta.pagination.nextOffset. totalAvailable = the complete export row count (NOT a page length).

TDQS

A4.7/5.0
Behavior5/5

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

Describes important behaviors beyond annotations: client-side pagination, no server pagination, trimmed strings with null for empty, formatted amounts, error handling (429/5xx/404/thrown, schema_drift for gated views), and SSRF safeguards. Annotations only provide readOnlyHint and openWorldHint; description adds rich detail without contradiction.

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?

Long but densely informative; front-loaded with purpose. Every sentence adds context, though some redundancy exists (e.g., repeated emphasis on SSRF). Could be slightly more concise, but remains effective.

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?

Fully explains return format (view, columns, rows, _meta), error handling, honest pagination, and data integrity. No output schema, so description compensates thoroughly. Covers all likely agent questions.

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

Parameters5/5

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

Schema coverage is 100%, and description adds substantial context: view enum explained with example data and record count, limit/offset explained with meaning of totalAvailable (true row count) and client-side pagination. Goes well beyond schema 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?

Clearly states it fetches a complete CSV export from a Tableau Server Guest view, specifically for government transparency data. Provides an explicit example (mt_contracts_awarded) and distinguishes from sibling tools which focus on different data sources.

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?

Explains the context (SLED transparency, keyless access) and when to use (fetching government contract data from Tableau). Lacks explicit when-not-to-use or direct alternatives, but the sibling list and clear scope make usage context clear.

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

treasury_avg_interest_ratesA
Read-only

Average interest rate the US Treasury pays by security type/description (keyless Treasury Fiscal Data). Returns record_date, securityType, securityDescription, avgInterestRatePercent (percent, number|null). latest (default true) returns the most-recent month's full breakdown across security types (pinned to the latest record_date, memoized 5 min); set latest=false with startDate/endDate for a range. Optional securityType narrows by exact security_type_desc (e.g. 'Marketable', 'Non-marketable').

ParametersJSON Schema
NameRequiredDescriptionDefault
latestNotrue (default) ⇒ the most-recent month's full breakdown across security types (pinned to the latest record_date, memoized). false ⇒ the startDate/endDate range.
endDateNoRange mode only: ISO YYYY-MM-DD upper bound on record_date (inclusive).
pageSizeNoRange mode: rows per page, 1..500, default 100.
startDateNoRange mode only: ISO YYYY-MM-DD lower bound on record_date (inclusive).
pageNumberNoRange mode: 1-based page number, default 1.
securityTypeNoOptional exact security_type_desc filter (e.g. 'Marketable', 'Non-marketable', 'Interest-bearing Debt').

TDQS

A4.5/5.0
Behavior4/5

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

Annotations provide readOnlyHint and openWorldHint. The description adds beyond annotations by detailing memoization (5 min), latest mode behavior (pinned to latest record_date), and that avgInterestRatePercent can be null. No contradiction with 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 two sentences with no fluff. First sentence clearly states purpose and output fields. Second sentence explains the two modes and optional filter. Every sentence adds value.

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?

Despite no output schema, the description lists all return fields and their types. It covers both modes, pagination, and filtering. For a read-only query tool with good annotations, this is complete.

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

Parameters4/5

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

Schema coverage is 100% with descriptions for each parameter. The description adds meaning by explaining how latest and range modes work together, that securityType is an exact match on security_type_desc, and the implications of pagination parameters (pageSize, pageNumber) in range mode.

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 'average interest rate the US Treasury pays by security type/description' and lists the specific fields returned. It distinguishes itself from sibling tools by focusing on a specific Treasury dataset and explaining the 'keyless Treasury Fiscal Data' nature.

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 explains two usage modes: 'latest' (default) for the most-recent month's breakdown with memoization, and range mode with start/endDate for historical data. It also notes optional securityType filter. While it doesn't explicitly state when not to use this tool, it provides sufficient context for correct usage.

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

treasury_debt_to_pennyA
Read-only

Daily total US public debt outstanding ('Debt to the Penny', keyless Treasury Fiscal Data). Returns record_date + totalPublicDebtOutstanding, debtHeldByPublic, intragovernmentalHoldings (USD). latest (default true) ⇒ the single most-recent day; set latest=false with startDate/endDate (ISO YYYY-MM-DD) for a date range, newest-first. Amounts are coerced to number|null (a null amount is 'no value reported', never 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
latestNotrue (default) ⇒ only the single most-recent day (page[size]=1). false ⇒ the startDate/endDate range, newest-first.
endDateNoRange mode only: ISO YYYY-MM-DD upper bound on record_date (inclusive).
pageSizeNoRange mode: rows per page, 1..500, default 100.
startDateNoRange mode only: ISO YYYY-MM-DD lower bound on record_date (inclusive).
pageNumberNoRange mode: 1-based page number, default 1.

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description adds valuable behavioral details: the tool is 'keyless' (no authentication required), amounts are coerced to number|null with a note that null means 'no value reported' (not zero), and the ordering is newest-first in range mode. No contradictions with 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 well-structured: first identifies the dataset and returned fields, then explains the two modes (latest vs. range), and finally clarifies null handling. Every sentence adds critical information without waste.

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

Completeness4/5

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

The description covers the returned fields, the two operation modes, date format, pagination parameters and defaults, and the null coercion behavior. Although there is no output schema, the agent can infer the output structure. It is self-contained enough for effective use.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description restates some schema fields (start/end date format) but adds the ordering (newest-first) and the default for latest. This provides marginal added value beyond the schema 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 returns 'Daily total US public debt outstanding' from the 'Debt to the Penny' dataset, specifying the exact fields returned (record_date, totalPublicDebtOutstanding, debtHeldByPublic, intragovernmentalHoldings). It distinguishes this tool from siblings like treasury_monthly_statement by focusing on daily data.

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 explains the two usage modes (latest=true for single most-recent day vs. latest=false with date range) and the parameters involved, but does not explicitly tell the agent when to prefer this tool over alternatives like treasury_monthly_statement or treasury_avg_interest_rates. The usage context is implied but not contrasted.

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

treasury_monthly_statementA
Read-only

Monthly Treasury Statement (MTS table 1, keyless): federal receipts, outlays, and deficit/surplus by month. Returns record_date, classification, grossReceipts, grossOutlays, deficitSurplus (USD, number|null). startDate/endDate (ISO YYYY-MM-DD) filter record_date (default: trailing ~12 months). By default excludeSummaryRows=true drops the fiscal-year parent/summary header rows (whose amounts are all null) via a server-side filter, so totalAvailable and rows reflect real child line-items only; set excludeSummaryRows=false to include them. Highest-value budget-analysis tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoISO YYYY-MM-DD upper bound on record_date (inclusive).
pageSizeNoRows per page, 1..500, default 100.
startDateNoISO YYYY-MM-DD lower bound on record_date (inclusive). Default: trailing ~12 months.
pageNumberNo1-based page number, default 1.
excludeSummaryRowsNotrue (default) excludes fiscal-year PARENT/SUMMARY rows (parent_id/amounts all null) via the server-side filter current_month_gross_outly_amt:gt:0, so only real child line-items (and totalAvailable) remain. false includes the null-amount summary rows.

TDQS

A4.8/5.0
Behavior5/5

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

Describes keyless nature, default date range, and detailed behavior of excludeSummaryRows with server-side filter. Annotations (readOnlyHint, openWorldHint) are consistent and description adds significant behavioral context.

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?

Single paragraph packed with essential information, front-loaded with purpose. Every sentence adds value without redundancy.

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?

Covers return fields, parameter defaults, and critical behavioral nuance. No output schema, but the description sufficiently explains what the tool returns.

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

Parameters5/5

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

Schema coverage is 100%, and description adds meaning: explains default startDate, clarifies excludeSummaryRows effect and server-side filter. No parameters lack 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 clearly states it provides federal receipts, outlays, and deficit/surplus by month from the MTS table 1. It specifies return fields and distinguishes itself from siblings by being the highest-value budget-analysis tool.

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

Usage Guidelines4/5

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

The description explicitly labels it as 'highest-value budget-analysis tool,' guiding usage. It does not explicitly list when not to use or alternatives, but the context of sibling tools implies its specific domain.

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

treasury_query_datasetA
Read-only

Escape-hatch query over 7 confirmed US Treasury Fiscal Data datasets (keyless): debt_to_penny, avg_interest_rates, mts_table_1 (Monthly Treasury Statement), rates_of_exchange, debt_outstanding, interest_expense (actual interest PAID / debt-service cost), tror (Treasury Report on Receivables — federal receivables + delinquent-debt collections by agency). Choose dataset (enum — no free path), and optionally project fields (CSV), filter (CSV 'col:op:val', ops lt|lte|gt|gte|eq|in, AND-combined), and sort (CSV, '-' = desc), with page[size]/page[number] pagination. Returns raw rows plus a truthful _meta (totalAvailable = upstream total-count, offset pagination). Value/amount fields are raw upstream strings — the string "null"/empty means 'no value', never 0. Covers rates_of_exchange + debt_outstanding without a dedicated tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoOptional CSV sort columns; prefix '-' for descending (e.g. '-record_date').
fieldsNoOptional CSV column projection (e.g. 'record_date,exchange_rate'). An unknown column ⇒ upstream HTTP 400 ⇒ invalid_input (surfaced as an error, never silently dropped).
filterNoOptional CSV of upstream filters 'col:op:val' (ops: lt|lte|gt|gte|eq|in), AND-combined — e.g. 'record_date:gte:2024-01-01,country_currency_desc:eq:Canada-Dollar'.
datasetYesWhich confirmed Treasury Fiscal Data dataset to query: debt_to_penny (daily total public debt), avg_interest_rates (avg rate by security type), mts_table_1 (Monthly Treasury Statement receipts/outlays/deficit), rates_of_exchange (quarterly FX by currency), debt_outstanding (historical fiscal-year-end debt), interest_expense (ACTUAL interest PAID / debt-service cost by security type — distinct from the rate), tror (Treasury Report on Receivables: federal receivables + delinquent-debt collections BY AGENCY).
pageSizeNoRows per page (upstream page[size]); 1..500, default 100.
pageNumberNo1-based page number (upstream page[number]); default 1.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows it is a safe read operation. The description adds useful behavioral context: keyless access, raw string values for amounts, null/empty handling, pagination behavior, and the truthful _meta field. No contradiction with annotations.

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 dense and informative, covering many aspects in a single paragraph. It front-loads the core purpose and dataset list. Could be slightly more structured (e.g., bullet points for parameters) but remains efficient with minimal waste.

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?

There is no output schema, so the description must cover return values. It does so: 'Returns raw rows plus a truthful `_meta` (totalAvailable = upstream total-count, offset pagination)' and explains that value/amount fields are raw strings with null/empty meaning 'no value'. It also describes error behavior for unknown columns. For a tool with 6 parameters and no output schema, this is comprehensive.

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

Parameters5/5

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

Schema description coverage is 100%, but the description adds significant extra meaning: explains that unknown columns in fields cause an upstream HTTP 400 error, provides filter syntax with examples, describes sort prefix '-' for descending, and gives pagination bounds (1..500, 1-based). Dataset enum values are explained in more detail. The description compensates completely for any ambiguity.

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 specifies it is an escape-hatch query over 7 confirmed US Treasury Fiscal Data datasets, listing them explicitly (debt_to_penny, avg_interest_rates, etc.). It distinguishes from sibling tools by noting it covers rates_of_exchange and debt_outstanding without a dedicated tool.

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

Usage Guidelines4/5

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

The description states 'Choose `dataset` (enum — no free path)' and describes the tool as an escape-hatch for 7 specific datasets. It implicitly guides usage by listing datasets and mentioning that it covers datasets without dedicated tools. No explicit when-not-to-use or alternatives, but the context of sibling tools provides clear differentiation.

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

usas_analyze_incumbentA
Read-only

Per-award incumbent + PUBLIC recompete-pressure analysis for ONE award (generatedInternalId). Assembles the incumbent identity, the vehicle/IDV linkage, and individual PUBLIC pressure SIGNALS — obligated-vs-ceiling consumption (pctConsumed), modification count (lower-bounded), competition extent + number of offers, set-aside, days to the current PoP end, and option-extendable days — plus, optionally, the incumbent's other awards in the same agency×NAICS. Bounded & keyless: at most 3 upstream calls (detail + 1 transactions page + 1 recipient search), no per-record fan-out. Emits pressureHints ('single_offer', 'ceiling_nearly_exhausted', 'hard_stop_no_options') as HINTS, NEVER a composite vulnerability score — CPARS/past-performance, protest history, and option-exercise intent are not public (declared in _meta.fieldsUnavailable).

ParametersJSON Schema
NameRequiredDescriptionDefault
otherAwardsLimitNoCap on incumbentOtherAwards (default 15, max 50).
includeOtherAwardsNoAlso return the incumbent's other awards in the same agency×NAICS via one bounded recipient search (default true).
generatedInternalIdYesThe ONE award to analyze — generatedInternalId from usas_search_individual_awards / usas_search_awards_by_recipient / usas_search_recompetes (e.g. CONT_AWD_*).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and openWorldHint. Description adds substantial value by detailing what signals are assembled (pctConsumed, mod count, etc.), that it emits pressureHints (never a composite score), and limits (at most 3 upstream calls). No contradictions with 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?

Every sentence earns its place. The description is dense but not verbose, front-loaded with core purpose, and structured to quickly convey scope, signals, limitations, and bounded behavior.

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

Completeness4/5

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

Despite no output schema, the description adequately explains the output by mentioning pressureHints, _meta.fieldsUnavailable, and the nature of returned data. It is complete for most use cases but could explicitly list the returned fields or structure.

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

Parameters5/5

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

Schema coverage is 100%, but description adds meaning beyond schema: explains generatedInternalId is 'the ONE award' and gives example sources, clarifies otherAwardsLimit as a cap with defaults, and states includeOtherAwards triggers a bounded recipient search with default true.

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?

Description clearly states it performs 'per-award incumbent + PUBLIC recompete-pressure analysis for ONE award' using generatedInternalId. This specific verb-resource-scope combination distinguishes it from sibling tools like usas_get_award_detail (just details) or usas_search_recompetes (search).

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?

Provides context about bounded upstream calls, optional includeOtherAwards, and explicitly declares unavailable fields (CPARS, past performance). However, it does not explicitly state when to use this tool versus alternatives or when not to use it, missing a clear exclusion criterion.

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

usas_autocomplete_naicsA
Read-only

Autocomplete NAICS codes by free-text. ANTI-HALLUCINATION GUARD — call this when the user mentions a NAICS theme but no specific code (e.g. 'computer systems design' → 541512). Avoids inventing NAICS codes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
searchTextYes

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses the anti-hallucination behavior and avoidance of code invention, adding context beyond annotations (readOnlyHint, openWorldHint). No contradiction; the description complements annotations effectively.

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 sentences, front-loaded with purpose and guard, no extraneous text. Efficient and effective.

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

Completeness4/5

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

For a simple autocomplete tool with no output schema and few parameters, the description covers purpose, usage, and behavioral traits. Lacks explicit mention of output format or limit behavior, but these are minor omissions given the tool's simplicity.

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%, and the description does not explain parameters 'searchText' and 'limit'. The example implies 'searchText' is the free-text query, but 'limit' is unmentioned. This is a significant gap for a tool with 2 parameters.

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 'Autocomplete NAICS codes by free-text', specifying the verb (autocomplete), resource (NAICS codes), and context (free-text input). It distinguishes from sibling tools like 'usas_naics_hierarchy' by emphasizing conversion of themes to codes, preventing hallucination.

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

Usage Guidelines5/5

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

Explicitly instructs to call 'when the user mentions a NAICS theme but no specific code' and warns against inventing codes. Provides an example and frames it as an 'ANTI-HALLUCINATION GUARD', giving clear when-to-use and when-not-to-use guidance.

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

usas_autocomplete_recipientA
Read-only

Autocomplete recipient names. ANTI-HALLUCINATION — confirm a recipient's exact USAspending-canonical legal name before searching by name. Returns up to 10 fuzzy matches with UEI/DUNS where available.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
searchTextYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint and openWorldHint. The description adds value by specifying the return of up to 10 fuzzy matches with UEI/DUNS and highlighting anti-hallucination behavior, which are not in 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 two sentences, front-loaded with the purpose and anti-hallucination warning. Every sentence provides essential information without redundancy.

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

Completeness4/5

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

Given the simple input schema and no output schema, the description covers the tool's behavior adequately: it mentions fuzzy matches, limits, and UEI/DUNS. It could mention what 'fuzzy' means, but overall sufficient.

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 coverage is 0%, and the description does not explain the 'searchText' or 'limit' parameters. It only hints at 'searchText' by context. For a tool with 2 parameters, more explicit parameter description is needed.

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 verb 'Autocomplete' and the resource 'recipient names', and explains the anti-hallucination purpose. It distinguishes itself from siblings like usas_search_recipients by specifying a focused autocomplete function.

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 explicitly advises using this tool to confirm exact legal names before searching, which is clear guidance on when to use it. However, it does not explicitly state when not to use it (e.g., if you already have the exact name).

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

usas_disaster_spendingA
Read-only

Disaster / emergency-fund spending BY GEOGRAPHY — obligations or outlays tagged to one or more Disaster Emergency Fund Codes (DEFC: COVID-19, IIJA, etc.), broken out per state / county / congressional district (keyless USAspending disaster/spending_by_geography). Answers 'which geographies captured COVID/IIJA relief money' — a distinct axis the standard award search does not expose. defCodes REQUIRED (discover via usas_list_disaster_codes); spendingType obligation (default) | outlay; geoLayer state (default) | county | district. Each row: name, code, amount, awardCount, population, perCapita. HONESTY: amount/perCapita are number|null (a real 0 stays 0 — some DEFCs like IIJA report $0 OBLIGATIONS with a nonzero awardCount, disclosed in a note; absent → null, never a fabricated 0); the endpoint returns the COMPLETE set of geo units (no pagination) so totalAvailable = returned; an outage/4xx THROWS (never a fake empty).

ParametersJSON Schema
NameRequiredDescriptionDefault
defCodesYesDisaster Emergency Fund Codes (DEFC) to include — REQUIRED. e.g. ['L','M'] (COVID-19 relief) or ['1'] (IIJA / infrastructure). Discover the full code set via usas_list_disaster_codes.
geoLayerNoGeographic breakout: state (default), county, or congressional district.
spendingTypeNoobligation (default) or outlay. Some DEFCs report $0 obligations but real outlays — try both.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint and openWorldHint annotations by detailing null handling (number|null for amount/perCapita, real 0 stays 0, absent becomes null), pagination behavior (complete set, no pagination), and error handling (throws on 4xx). No contradictions with annotations.

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 thorough and well-organized, front-loading the core purpose and key constraints. It includes valuable notes on null handling and endpoint behavior, but could be slightly more concise; some details are repeated (e.g., defaults mentioned twice). Overall, efficient for the complexity.

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?

Given no output schema, the description sufficiently outlines the output fields (name, code, amount, awardCount, population, perCapita) and explains null handling. It covers all parameters, default behaviors, and error states. The tool's complexity (3 params, 1 required, 2 enums) is fully addressed.

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

Parameters5/5

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

Although the schema covers all parameters (100% coverage), the description adds meaningful context: explains the role of defCodes (linked to usas_list_disaster_codes), spendingType (obligation vs outlay with a note about real outlays), and geoLayer (default values and levels). This enriches the parameter semantics significantly.

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: disaster spending by geography with DEFC tags, breaking out by state/county/district. It explicitly distinguishes from standard award search by emphasizing the geography axis and mentions it's a distinct endpoint not covered by other tools.

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

Usage Guidelines4/5

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

The description provides clear guidance on required parameters (defCodes) and defaults for spendingType and geoLayer. It also suggests trying both obligation and outlay. However, it does not explicitly state when not to use this tool vs alternatives, only implying its distinct purpose.

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

usas_get_agency_awards_summaryA
Read-only

High-level award activity for a fiscal year — transaction_count + obligations + latest_action_date. SCOPE: obligations/transaction_count span ALL award types (contracts, grants, direct payments incl. benefits, loans) — NOT prime contracts only. For benefit-heavy agencies (VA/SSA/HHS) this is dominated by direct benefit payments (e.g. VA FY2024 ~$238B all-awards vs ~$67B prime contracts), so do NOT read it as the contract/procurement market; for procurement-heavy agencies (DoD/DHS) it closely tracks contract spending. For contracts-only obligations use usas_spending_over_time (contractObligations) — it takes the agency canonical NAME, so resolve it from this toptierCode via usas_get_agency_profile first.

ParametersJSON Schema
NameRequiredDescriptionDefault
fiscalYearNo
toptierCodeYes3-4 digit toptier code from usas_lookup_agency (e.g. '036' for VA)

TDQS

A4.6/5.0
Behavior5/5

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

Adds critical context beyond readOnlyHint/openWorldHint: explains scope spans all award types, not just contracts, and how data differs by agency type. No contradiction with annotations.

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?

Efficient, front-loaded with purpose, then scope, warnings, alternatives. Slightly long but all sentences earn their place.

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

Completeness5/5

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

No output schema, but description lists key output fields (transaction_count, obligations, latest_action_date). Explains scope and limitations fully, making tool well-understood.

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

Parameters3/5

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

Schema coverage is 50% (only toptierCode has description). Description gives example value for toptierCode but does not explain fiscalYear format or range. Adequate but could be more detailed.

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

Purpose5/5

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

Clearly states verb 'get summary' and resource 'awards' for a fiscal year, listing output fields. Distinguishes from sibling usas_spending_over_time for contracts-only.

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

Usage Guidelines5/5

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

Explicitly tells when to use alternative (usas_spending_over_time for contracts-only) and warns about benefit-heavy agency interpretation. Also advises resolving toptierCode via usas_get_agency_profile.

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

usas_get_agency_budget_functionA
Read-only

Budget function breakdown for an agency × fiscal year. Returns the agency's spending by program area (e.g. VA: 'Income security for veterans' $204B, 'Hospital and medical care for veterans' $126B).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
fiscalYearNo
toptierCodeYes3-4 digit toptier code from usas_lookup_agency (e.g. '036' for VA)

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so description does not need to state it's read-only. The description adds context about output format (spending by program area with dollar amounts) but omits behavioral traits like pagination (limit parameter) or what happens if fiscalYear is omitted.

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 a single sentence with an example, perfectly front-loaded. Every word adds value with no fluff.

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

Completeness4/5

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

Given no output schema, the description provides a helpful example of the return structure. However, it lacks details on pagination (limit parameter) and the optional fiscalYear default, which would improve completeness for a complex tool with 3 parameters.

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 has 3 parameters with 33% description coverage. The description adds meaning for toptierCode (links to usas_lookup_agency) and implicitly mentions fiscalYear, but does not explain limit or fiscalYear defaults/format. With low schema coverage, more parameter detail in description would be beneficial.

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 a 'budget function breakdown for an agency × fiscal year' with spending by program area, using a concrete example for VA. This is a specific verb+resource that distinguishes it from sibling tools like usas_get_agency_profile or usas_search_agency_spending.

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 context (when needing spending by budget function) but does not explicitly state when to use this tool versus alternatives like usas_search_agency_spending. No guidance on prerequisites or excluded scenarios.

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

usas_get_agency_profileA
Read-only

Get full agency profile by toptier code (3-4 digits, from usas_lookup_agency). Returns mission, abbreviation, website, subtier_agency_count, congressional_justification_url.

ParametersJSON Schema
NameRequiredDescriptionDefault
toptierCodeYes3-4 digit toptier code from usas_lookup_agency (e.g. '036' for VA)

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. Description adds return field details but no further behavioral traits. Consistent with 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?

Single sentence, front-loaded with purpose. No wasted words.

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

Completeness5/5

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

For a single-record lookup with no output schema, description fully covers purpose, parameter, and return fields. Adequate for agent to invoke correctly.

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 has 100% coverage with description including example. Description repeats code format and adds parenthetical example, but does not add significant new meaning beyond schema.

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

Purpose5/5

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

Clearly states verb 'Get' and resource 'agency profile', specifies parameter (toptier code) and return fields. Distinguishes from siblings like usas_lookup_agency which lists agencies.

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?

Provides context for when to use: 'by toptier code (3-4 digits, from usas_lookup_agency)'. Implies prerequisite lookup but lacks explicit alternatives or exclusions.

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

usas_get_award_detailA
Read-only

Fetch full detail for a single award by generatedInternalId (from usas_search_individual_awards). Returns period_of_performance (start/end/potential_end), base_and_all_options, set-aside type, competition extent, number_of_offers — the per-award fields the search endpoint omits.

ParametersJSON Schema
NameRequiredDescriptionDefault
generatedInternalIdYesFrom spending_by_award results — e.g. CONT_AWD_*

TDQS

A4.7/5.0
Behavior5/5

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

The description goes beyond annotations by listing specific return fields (period_of_performance, base_and_all_options, set-aside type, etc.) and explaining that it returns what the search endpoint omits. No contradiction with 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 a single, well-structured sentence that conveys purpose, parameter source, and returned fields efficiently. No redundant information.

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?

Given the simple nature of the tool (one parameter, no output schema), the description is complete. It informs the agent what to expect in terms of return fields and parameter source.

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?

The single parameter is well-described in both schema and description. The description adds value by specifying the source tool and example format, though the schema already provides a clear description.

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 action ('Fetch full detail'), the specific resource ('single award'), and identifies the identifier ('generatedInternalId') with its source. It distinguishes itself from the sibling search tool by listing fields it returns that the search omits.

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 explicitly states when to use this tool (after usas_search_individual_awards to get full details). It does not explicitly say when not to use it or provide alternatives, but the context is clear.

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

usas_get_recipient_profileA
Read-only

Full recipient detail by recipient_id (from usas_search_recipients). Returns alternate_names (M&A history), DUNS, UEI, parent linkage, business_types, location, total_amount, total_transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipientIdYesFrom usas_search_recipients — e.g. 'ed02855e-...-P'

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds value by detailing the returned fields (e.g., M&A history, parent linkage), confirming the read-only nature without contradicting annotations.

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 sentence that efficiently conveys the purpose and output. It could be slightly more structured, but it lacks unnecessary fluff.

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?

With no output schema, the description adequately lists the key fields returned. For a simple retrieval tool with one parameter, this is sufficient to inform an agent about what to expect.

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

Parameters3/5

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

Schema coverage is 100%, and the schema description already provides an example format. The description doesn't add significant new meaning beyond stating the source, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool retrieves a full recipient profile by recipient_id and lists the specific fields returned (alternate_names, DUNS, UEI, etc.). It distinguishes itself from sibling tools like usas_search_recipients by focusing on a single record detail.

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 explicitly mentions that the recipient_id comes from usas_search_recipients, providing a clear prerequisite. While it doesn't list all alternatives, the sibling context and this hint are sufficient for an agent to determine when to use this tool.

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

usas_glossaryA
Read-only

USAspending glossary of 151 federal-spending terms. Use to confirm terminology ('what's a TAS?', 'what's an obligation vs outlay?') before answering compliance/budget questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
searchNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark the tool as readOnlyHint=true and openWorldHint=true. The description adds value by specifying the scope (151 terms from USAspending) and giving example queries, which helps the agent understand what behavior to expect beyond the annotation tags.

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

Conciseness5/5

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

The description is two sentences with no superfluous information. It front-loads the core purpose and immediately follows with a practical usage directive, making it easy to parse.

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?

For a simple glossary tool, the description covers purpose and usage but omits output details and parameter semantics. Given the lack of output schema, the agent might need to guess at the response format, but the simplicity keeps this gap manageable.

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 coverage is 0%, meaning no parameter descriptions exist in the schema. The description does not explain what 'limit' or 'search' do, leaving the agent to infer their purpose from context. Only minimal guidance is provided through the overall purpose.

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 explicitly states it's a glossary of 151 federal-spending terms and provides specific usage examples like 'what's a TAS?' and 'obligation vs outlay?'. This clearly distinguishes it from sibling tools, none of which serve a glossary purpose.

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 tells the agent to use the tool to confirm terminology before answering compliance/budget questions, providing clear context. However, it does not specify when not to use or suggest alternatives, though the sibling list lacks similar tools so confusion is minimal.

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

usas_list_disaster_codesA
Read-only

List the Disaster Emergency Fund Codes (DEFC) — the supplemental-appropriation tags (COVID-19 relief, IIJA/infrastructure, and other emergency laws) that usas_disaster_spending filters on. Keyless USAspending references/def_codes. Returns the COMPLETE code set (no pagination): each code with its group ('covid_19' | 'infrastructure' | null), title, and publicLaw. Use this to discover the codes to pass to usas_disaster_spending. HONESTY: group is null (never fabricated) when a code belongs to no named group; totalAvailable is the exact complete count.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description adds that the tool returns the complete code set with no pagination, details the fields per code (group, title, publicLaw), and includes an honest note about null groups and exact totalAvailable. This provides comprehensive behavioral insight.

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 a single paragraph that is well-structured and concise. Every sentence adds value: purpose, usage, return details, and honesty note. No wasted words.

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

Completeness5/5

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

For a zero-parameter tool with no output schema, the description fully explains what is returned (code, group, title, publicLaw), the completeness of the set, and the context of DEFCs. It is sufficient for an agent to use the tool correctly.

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?

The tool has zero parameters, so the description correctly does not need to explain parameters. Per guidelines, baseline is 4. The description instead focuses on the return structure, adding value.

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 lists Disaster Emergency Fund Codes (DEFC), specifies what they are (supplemental-appropriation tags), and explicitly differentiates from the sibling tool usas_disaster_spending by mentioning it filters on these codes. The verb 'list' and resource 'disaster codes' are precise.

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 explicitly tells when to use: 'Use this to discover the codes to pass to usas_disaster_spending.' This provides clear context for usage. It does not mention when not to use, but the guidance is strong for the intended use case.

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

usas_list_toptier_agenciesA
Read-only

List all toptier federal agencies with toptier_code, abbreviation, slug, current-FY obligations. Use for 'show me every cabinet department + their FY26 spending' or to find a toptier_code for usas_get_agency_*.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already state readOnlyHint=true and openWorldHint=true. Description adds value by specifying the output fields (toptier_code, abbreviation, slug, obligations) and the scope (list all toptier agencies). No contradiction; it complements annotations well.

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, no fluff. The first sentence states the action and output; the second provides usage context. Front-loaded and efficient.

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?

Covers purpose, output, and usage, but lacks details on default behavior of the optional limit parameter (e.g., no pagination info, default count). Also does not mention data freshness or error handling. Given the simple tool, it's adequate but incomplete.

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?

The only parameter 'limit' has 0% schema description coverage; the description does not mention it at all. The description fails to explain what limit does (e.g., maximum number of agencies), which is critical for an agent to use the tool correctly.

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

Purpose5/5

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

Clearly states the verb 'list', the resource 'toptier federal agencies', and the specific data returned (toptier_code, abbreviation, slug, current-FY obligations). Provides concrete use case examples, effectively distinguishing it from sibling tools like usas_get_agency_profile or usas_lookup_agency.

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

Usage Guidelines4/5

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

Explicitly gives two use cases: listing all cabinet departments with spending and finding a toptier_code for other agency tools. While it doesn't explicitly state when not to use, the examples imply appropriate context. Could mention alternatives but still provides clear guidance.

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

usas_lookup_agencyA
Read-only

Resolve a user-friendly agency reference ('VA', 'Veterans Affairs', 'DHS') to USAspending's canonical toptier name + 4-digit code. ALWAYS call this FIRST if the user uses an abbreviation — other USAspending tools require the canonical name.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchTextYesAgency name or abbreviation

TDQS

A4.5/5.0
Behavior4/5

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

With readOnlyHint and openWorldHint annotations, description adds output behavior (returns canonical name+code) and implies mapping function. No contradictions.

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 efficient sentences with no redundancy. Every part adds value, including the imperative 'ALWAYS call this FIRST'.

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?

Complete for a simple lookup tool with one parameter and no output schema. Covers purpose, usage, and output format.

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

Parameters3/5

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

Schema coverage is 100% with clear description for searchText. Description provides examples but doesn't add significant new semantic information beyond schema.

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

Purpose5/5

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

Description clearly states it resolves user-friendly agency references to canonical name and 4-digit code, distinguishing from sibling tools that require canonical names.

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

Usage Guidelines5/5

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

Explicitly instructs to call this FIRST when user uses an abbreviation and explains why other tools need canonical names.

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

usas_naics_hierarchyA
Read-only

Navigate the NAICS hierarchy (2→4→6 digit) + active-contract count per code. No naicsFilter ⇒ the top-level 2-digit sectors. With naicsFilter= ⇒ that node is in parent and its DIRECT children are in hierarchy (drill into any row where hasChildren:true by re-calling with its code). A 6-digit leaf returns hierarchy:[] with the node in parent (found:true); a nonexistent code returns hierarchy:[] with parent:null (found:false). Use to explore market scope (e.g. what's under NAICS 54 = Professional, Scientific, and Technical Services).

ParametersJSON Schema
NameRequiredDescriptionDefault
naicsFilterNoFilter to a specific NAICS code subtree, e.g. '541512'

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds behavioral context beyond annotations: it details the response structure (parent, hierarchy), active-contract count per code, and edge cases (nonexistent code returns parent:null, found:false). No contradiction with annotations.

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 concise and well-structured, with a clear flow from purpose to behavior to edge cases to example. It is slightly dense but efficient, earning a 4 for being informative without redundancy.

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

Completeness4/5

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

Given the single parameter and no output schema, the description is highly complete. It covers all input scenarios and edge cases. While it implicitly describes the response structure, it could explicitly mention the fields in hierarchy objects (code, title, contractCount, hasChildren) for full completeness.

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

Parameters5/5

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

Schema has one parameter with 100% description coverage. The description adds significant meaning: it explains how the parameter affects behavior (no filter vs. filter), and what the response contains for each case. This goes well beyond the schema description.

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: navigate the NAICS hierarchy (2→4→6 digit) with active-contract counts per code. It distinguishes from sibling tools like usas_autocomplete_naics by specifying hierarchy navigation and contract counts.

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

Usage Guidelines5/5

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

The description explains when to use the tool: to explore market scope, e.g., what's under NAICS 54. It provides precise usage guidance: no filter returns top-level sectors; with filter returns parent and direct children; includes drill-down instructions for hasChildren:true.

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

usas_search_agency_spendingA
Read-only

Spending broken down by awarding agency. Use for 'which agencies spend the most on NAICS 541512' — top buyers by $.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
setAsideNo
fiscalYearNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to repeat safety traits. It adds the context that spending is aggregated by awarding agency, but does not disclose other behavioral details like pagination or response format. This is adequate given the 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 two sentences with no filler. It front-loads the core purpose and provides a concrete example. Every word earns its place.

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 no output schema and 4 undocumented parameters, the description provides insufficient context for correct invocation. The example only hints at one parameter (NAICS). An agent would need more information on required vs optional params, result format, and typical usage patterns.

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%, and the description only mentions 'NAICS' in the example. It does not explain any of the four parameters (limit, naics, setAside, fiscalYear), so the description fails to compensate for the missing schema documentation. The agent must infer parameter meanings from names alone.

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 spending broken down by awarding agency and gives a specific example query (NAICS 541512). This distinguishes it from siblings like usas_search_subagency_spending or usas_search_psc_spending, which break down by other dimensions.

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

Usage Guidelines4/5

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

The description provides a concrete use case ('which agencies spend the most on NAICS 541512') and implies this tool is for top-level agency aggregation. It does not explicitly state when not to use it, but the purpose is clear enough for an AI to select it over similar tools.

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

usas_search_awardsA
Read-only

Aggregate share-of-wallet on USAspending. Given an agency × NAICS × fiscal year, returns top recipients by total obligated $ ONLY — per-recipient award COUNTS are NOT returned by this endpoint (awards/totalAwards are null, not 0); for real per-recipient contract counts use usas_search_awards_by_recipient (its _meta.totalAvailable) or usas_get_recipient_profile. Use for competitive landscape ('who wins at VA in 541512?').

ParametersJSON Schema
NameRequiredDescriptionDefault
naicsNo
agencyNoCanonical agency name
setAsideNo
fiscalYearNo

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses behavior beyond annotations: it states that per-recipient award counts are null (not 0) and only obligated $ is returned. This adds context to the readOnlyHint and openWorldHint, without contradiction.

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 sentences efficiently cover purpose, limitation, alternatives, and use case. Every sentence adds value without redundancy.

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?

Given no output schema, the description adequately explains what is returned (top recipients by obligated $) and what is not (counts). It also provides a concrete use case, making the tool's scope and limitations clear.

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

Parameters4/5

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

Schema description coverage is low (25%: only agency described). The description adds meaning by tying parameters to the use case (agency × NAICS × fiscal year) and implies their role in filtering. However, it does not detail the setAside parameter format or values, which would have enhanced clarity further.

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 it aggregates share-of-wallet on USAspending, specifying inputs (agency, NAICS, fiscal year) and output (top recipients by total obligated $). It distinguishes from sibling tools by noting that per-recipient award counts are not returned, making the purpose unambiguous.

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

Usage Guidelines5/5

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

The description explicitly tells when to use the tool (e.g., 'who wins at VA in 541512?') and when not to (when counts are needed), directing to alternatives like usas_search_awards_by_recipient or usas_get_recipient_profile. This provides clear guidance.

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

usas_search_awards_by_recipientA
Read-only

Pull every contract a specific recipient has won within an agency × NAICS slice. Use when the user asks 'show me Booz Allen wins at VA last year' — returns line items + naicsCode + description, not aggregates.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
agencyNo
fiscalYearNo
recipientNameYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds behavioral context by stating it returns line items (including naicsCode and description) rather than aggregates, which goes beyond the 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?

Two sentences with no wasted words. The purpose is stated first, followed by a usage example, then output clarification. Every sentence adds unique value.

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?

Considering no output schema, the description adequately describes the output (line items with naicsCode and description) and the main parameters. It could detail what 'line items' includes but is sufficient for an agent to reason about the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning to parameters like recipientName, agency, naics, and fiscalYear through the example and context, but does not fully document all parameters (e.g., limit is only implied). The description provides intermediate value.

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: pulling every contract a specific recipient has won within an agency×NAICS slice. It gives a concrete example ('show me Booz Allen wins at VA last year') and distinguishes from aggregates by noting it returns line items, not aggregates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case with a specific user query example. It implies when to use this tool (for recipient-specific slices) but does not explicitly exclude other cases or compare to sibling tools like 'usas_search_awards' or 'usas_search_individual_awards'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_cfda_spendingA
Read-only

Spending broken down by CFDA grant program code. Use for grant analysis — 'top federal grant programs by $'. Note: CFDA is grants (award_type 02-05), not contracts. Use usas_search_psc_spending for contract market analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
agencyNoCanonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency.
fiscalYearNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description's job is lighter. It adds value by specifying the grant scope (award types 02-05) and clarifying that this tool covers CFDA programs, not contracts. No contradictions with 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 four clear sentences that immediately convey purpose, use case, and limitations. Every sentence adds essential information with no redundancy, making it highly concise and readable.

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?

The description gives sufficient context for a simple search tool, covering purpose and domain differentiation. However, it does not describe the output structure (e.g., list of spending amounts by CFDA code) or how the parameters affect results. For a 3-parameter tool without output schema, this is adequate but not complete.

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?

With only 33% schema description coverage (only agency has a description), the tool description should compensate but does not. The description mentions 'CFDA grant program code' but does not explain how parameters like limit, agency, or fiscalYear relate to that. No parameter-level guidance is provided beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides spending data broken down by CFDA grant program code, with the specific use case 'top federal grant programs by $'. It further distinguishes from sibling tools by noting that CFDA covers grants (award types 02-05) not contracts, and explicitly recommends usas_search_psc_spending for contract analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('Use for grant analysis') and when not to ('not contracts'), providing a direct alternative: 'Use usas_search_psc_spending for contract market analysis.' This gives clear context for choosing among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_expiring_contractsA
Read-only

DEPRECATED — use usas_search_recompetes. Thin backward-compatible alias: finds contracts at agency × NAICS expiring within N months and returns the legacy { contracts, searchedCount } shape. New callers should use usas_search_recompetes for the full window/pagination controls and truthful completeness metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
agencyNo
minAwardValueNo
monthsUntilExpiryNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=true and openWorldHint=true, so no destructive behavior. The description adds that it is a thin backward-compatible alias and returns the legacy { contracts, searchedCount } shape, which is useful context beyond annotations. No contradictions.

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 sentences, extremely concise, with the deprecation warning front-loaded. No unnecessary information; every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a deprecated alias tool, the description covers deprecation, recommendation, legacy return shape, and basic functionality. It does not detail all parameters or output fully, but given the tool's limited role, it is sufficiently complete with the sibling tool handling new use cases.

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 has 5 parameters with 0% description coverage. The description only hints at agency, NAICS, and monthsUntilExpiry via usage context, but does not explain limit, minAwardValue, or provide any specific parameter details. Inadequate compensation for the coverage gap.

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 identifies the tool as a deprecated alias for usas_search_recompetes, explains it finds contracts by agency and NAICS expiring within N months, and distinguishes it from the recommended sibling tool by noting the legacy return shape.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'DEPRECATED — use usas_search_recompetes' and advises new callers to use usas_search_recompetes for full controls and truthful metadata, providing clear when-to-use (backward compatibility) and when-not-to-use (new callers) guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_federal_account_spendingB
Read-only

Spending broken down by federal account / Treasury Account Symbol (TAS). Use to map money to the actual budget line item (e.g. '036-0167 = Information Technology Systems, VA').

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
agencyNoCanonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency.
fiscalYearNo

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint and openWorldHint. Description adds no behavioral context beyond the example, missing details on pagination or response structure.

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 sentences, efficient and front-loaded with key 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?

No output schema, limited parameter documentation, and no description of return values. Tool definition feels incomplete for a spending query.

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 coverage is only 25% (agency described). Description does not elaborate on any parameters, failing to compensate for low coverage.

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?

Description clearly states it retrieves spending by federal account/TAS and gives an example. However, it does not distinguish from siblings like usas_search_agency_spending or usas_search_subagency_spending.

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?

Implied usage: 'Use to map money to the actual budget line item.' No explicit when-not or alternatives provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_individual_awardsA
Read-only

Line-item federal contracts on USAspending. Returns specific awards (recipient + $ + sub-agency + state + description). Use AFTER usas_search_awards when the user wants 'show me the actual contracts'. Each result includes a generatedInternalId for usas_get_award_detail follow-ups.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
agencyNoCanonical agency name
setAsideNo
fiscalYearNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and openWorldHint=true, so no destructive actions and data from external source. Description adds that results are line-item level with a generatedInternalId for follow-up, which is useful context beyond annotations. Could mention potential issues like data freshness or pagination, but not required.

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?

Three concise sentences with no wasted words. Front-loaded with the core purpose, then usage guidance, then follow-up capability. Every sentence earns its place.

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?

While the description gives clear purpose and usage hints, it lacks details on parameter semantics, response format (beyond listed fields), pagination, or any limitations. For a 5-parameter search tool with no output schema, more complete guidance on how to craft effective searches would be beneficial.

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 only 20% (only agency parameter described). The description does not explain how to use parameters like limit, naics, setAside, fiscalYear, or their impact on results. It mentions output fields but not parameter selection, failing to compensate for low schema coverage.

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 it returns line-item federal contracts (specific awards) with detailed fields (recipient, $, sub-agency, state, description), and distinguishes it from the sibling tool usas_search_awards by stating to use it after that tool when the user wants actual contracts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly guides the agent to use this tool AFTER usas_search_awards for detailed contracts, and indicates follow-up with usas_get_award_detail using the generatedInternalId. Provides clear when-to-use and alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_psc_spendingA
Read-only

Spending broken down by Product Service Code (PSC). Use for 'what PSC categories see the most $ at DoD' — surfaces market structure beyond NAICS (e.g. PSC R425 = engineering support services).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
agencyNoCanonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency.
fiscalYearNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint and openWorldHint. Description confirms it returns spending data broken by PSC, adding market structure insight. No contradiction.

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 sentences, front-loaded with purpose and immediate use case. No wasted 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?

With no output schema, description only states returns PSC spending. Could be improved by mentioning data format, sorting, or pagination. Adequate but not thorough.

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 coverage is only 25% (agency has description). Description does not explain limit, naics, or fiscalYear parameters beyond the general purpose. Agent gets little guidance on how to use these parameters correctly.

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?

Clear verb 'Search' and resource 'PSC Spending' with example use case ('what PSC categories see the most $ at DoD') and differentiation from NAICS. Distinguishes from sibling tools like usas_search_awards and usas_search_agency_spending.

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?

Provides concrete use case ('find spending by PSC categories') and hints at when to use over NAICS-based tools. Lacks explicit when-not-to-use or comparison to other similar tools, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_recipientsA
Read-only

Search USAspending recipient list with parent/child/recipient hierarchy. Returns recipients with id, duns, uei, level (P=parent, C=child, R=recipient), total_amount. Use for 'find the recipient_id for Booz Allen' before usas_get_recipient_profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
keywordYes
recipientLevelNoP=parent, C=child, R=recipient

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and openWorld hints. Description adds hierarchy and return field details but does not disclose additional behavioral traits. No contradiction with 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?

Two sentences: first states purpose and output, second gives usage example. No wasted words, front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with no output schema, description adequately covers purpose, parameter implications, and expected output. Missing some detail on limit and pagination, but sufficient for common use.

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 coverage is low (33%) with only recipientLevel described. Description does not compensate for keyword or limit parameters; it only explains the return value hierarchy. Minimal added value over schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it searches USAspending recipient list with hierarchy detail (parent/child/recipient) and specifies return fields. It distinguishes itself as preliminary step before usas_get_recipient_profile, differentiating from siblings like usas_autocomplete_recipient.

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?

Provides explicit use case example ('find the recipient_id for Booz Allen') and indicates it should be used before usas_get_recipient_profile. Lacks explicit alternatives or when-not-to-use, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_recompetesA
Read-only

Recompete radar — federal contracts whose CURRENT period of performance ends inside a window around today (default -90d .. +18mo), sorted soonest-first. Use for 'what VA 541512 contracts are up for recompete in the next 18 months'. Reads the current PoP end date directly from spending_by_award (no per-award enrichment), counts (never drops) rows with missing end dates, and flags in _meta when the scan budget truncates the window (totalAvailable becomes null). Filter by agency/naics/pscCodes/setAside/minAwardValue; set includePotentialEnd for option-inclusive end dates. Public signals only — no CPARS/protest/option-intent, no composite vulnerability score.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page (default 1).
naicsNo6-digit NAICS code, e.g. '541512'
agencyNoCanonical awarding toptier agency name (use usas_lookup_agency)
pageSizeNoRows per page (default 25, max 100).
pscCodesNoProduct/Service Codes to filter on, e.g. ['DA01','R425']
setAsideNoUSAspending set_aside_type_code (honored server-side)
minAwardValueNoMinimum Award Amount ($) to include (default 0).
windowEndDaysNoUpper edge of the window in days from today (default 548 ≈ 18 months).
scanBudgetPagesNoMax 100-row pages to scan before giving up (default 8). If exhausted before the window ends, results are a lower bound and totalAvailable is null.
windowStartDaysNoLower edge of the recompete window in days from today (default -90 = include contracts that ended up to 90 days ago).
includePotentialEndNoAlso return the potential (option-inclusive) PoP end date + extendableDays (default false).
actionDateLookbackYearsNoaction_date lower bound in years (default 3). Contracts with no recorded action in this span are excluded — this bound makes the End-Date sort reach the window.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond the readOnlyHint and openWorldHint annotations. It explains that data comes directly from spending_by_award, that missing end dates are counted but not dropped, and that a truncation flag appears in _meta. It also notes limitations ('no per-award enrichment'). This is valuable transparency for a read-only tool.

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 moderately concise and front-loaded with the core purpose. However, it includes some technical details ('spending_by_award', '_meta') that could be streamlined. While every sentence adds information, the overall length and density could be slightly reduced without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (12 parameters, no output schema), the description provides substantial context: core logic, filtering, limitations, and behavioral flags. It explains what the tool returns (rows, _meta) and mentions missing end dates. The only minor gap is the lack of explicit output format or example, but the description is still quite complete for effective usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter well. The description adds value by explaining the window concept (windowStartDays/windowEndDays) and how scanBudgetPages affects results. It also clarifies that setAside is 'honored server-side'. This contextual information enhances understanding beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose using a specific verb ('search recompetes') and describes the resource (federal contracts with ending PoP within a window). It provides a usage example ('what VA 541512 contracts are up for recompete in the next 18 months'), which aids understanding. However, it does not explicitly differentiate from the similar sibling tool 'usas_search_expiring_contracts', which slightly reduces clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear usage example and lists filtering options (agency, naics, pscCodes, etc.). It also states what the tool does NOT cover ('Public signals only — no CPARS/protest/option-intent'), giving implicit guidance on when not to use it. However, it does not explicitly compare with alternatives like 'usas_search_expiring_contracts' or 'usas_search_awards'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_state_spendingA
Read-only

Spending broken down by state / territory. Use for 'where is the most federal $ flowing for NAICS 541512' — answers like 'VA $128B, MD $66B, DC $58B'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
agencyNoCanonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency.
fiscalYearNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds context about the granularity (state/territory breakdown) and example output format, without contradicting annotations. No additional behavioral traits are disclosed, but the baseline is already covered.

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 a single sentence with a concrete example. It is front-loaded with the core purpose and uses minimal words, earning its place with 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 the tool has 4 optional parameters, no output schema, and annotations covering safety and open world, the description provides a clear use case and output format hint. It is sufficient for a search tool but could address more parameter scenarios.

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 only 25% (only the 'agency' parameter has a description). The description does not explain 'limit', 'fiscalYear', or 'naics' beyond the example implicit usage. With low coverage, the description should compensate but fails to do so.

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 provides spending broken down by state/territory. It gives a specific example query and answer format, and distinguishes from sibling tools like usas_search_agency_spending (agency-level) and usas_search_subagency_spending.

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 includes an example query ('where is the most federal $ flowing for NAICS 541512') and what answer to expect, providing clear context for when to use this tool. However, it does not explicitly state when not to use or mention alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_subagency_spendingA
Read-only

Break down a parent agency's spending by sub-agency / office. Surfaces which office holds the budget (e.g. VA OI&T vs VHA, DoD vs Army vs DISA).

ParametersJSON Schema
NameRequiredDescriptionDefault
agencyYesCanonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency / usas_list_toptier_agencies.
fiscalYearNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint true and openWorldHint true. The description adds the behavioral trait of surfacing sub-agency budget holders, but it does not go beyond what annotations suggest. No mention of performance, indexing, or limitations.

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 sentences, front-loaded with the main purpose. No wasted words. The structure efficiently conveys the tool's function and gives concrete examples.

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?

The description is complete for a query tool that returns sub-agency spending breakdowns. However, it does not mention whether results are aggregated or list-based, nor does it address pagination or limits. Given no output schema, a bit more detail on what the response contains would be helpful.

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?

The description does not add meaning beyond the input schema. The schema has detailed description for 'agency' but none for 'fiscalYear'. The description fails to compensate for the missing schema coverage on fiscalYear.

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: breaking down a parent agency's spending by sub-agency/office. It uses specific verbs and provides examples (VA OI&T vs VHA) that distinguish it from sibling tools like usas_search_agency_spending.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a sub-agency breakdown is needed, but it does not explicitly state when to use this tool versus alternatives or provide exclusions. No direct comparison with sibling tools is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_subawardsA
Read-only

Enumerate federal subawards (subcontracts), optionally filtered by SUBAWARDEE name. Use for 'where does Leidos appear as a SUBcontractor, and under which primes' — surfaces the prime/sub network for teaming-map artifacts. NOTE: subRecipientName matches the SUB-recipient, NOT the prime (the keyless spending_by_award subaward view has no prime-name filter); to see the subs UNDER a specific prime, resolve that prime's awards first (usas_search_awards → usas_get_award_detail) and read their sub network. Each row carries subRecipient (the subawardee), amount, actionDate, the prime award id, and the prime award's NAICS.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
naicsNo
agencyNo
fiscalYearNo
subRecipientNameNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=true and openWorldHint=true, which are consistent. The description adds behavioral context: the tool returns rows with specific fields (subRecipient, amount, actionDate, prime award id, NAICS), and it notes that there is no prime-name filter due to the view's structure. This goes beyond the 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 concise (3-4 sentences) and front-loaded: it starts with the main purpose, then provides a usage example, a critical note about limitations, and finally lists return fields. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 parameters, no output schema), the description provides good context: purpose, usage, return fields, and limitations. It does not explain pagination or the limit parameter behavior, but for a search tool this is acceptable. No output schema means return fields are covered in the description.

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 only explains the subRecipientName parameter in detail, leaving limit, naics, agency, and fiscalYear unmentioned. While parameter names are somewhat self-explanatory, the description does not add enough value for all parameters.

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 enumerates federal subawards with optional filtering by subrecipient name, and provides a concrete example ('where does Leidos appear as a SUBcontractor'). It distinguishes itself from sibling tools like usas_search_awards and usas_get_award_detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool (to find subs under a prime by subrecipient name) and when not to (to find subs under a specific prime, use other tools). It provides a clear workflow: 'resolve that prime's awards first (usas_search_awards -> usas_get_award_detail) and read their sub network.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_search_teaming_partnersA
Read-only

Small-business teaming-partner discovery by socioeconomic certification + NAICS + agency award history (keyless USAspending proxy), integrity-screened. Given a cert (enum-validated), optional naics/agency/subagency, and a lookback window, aggregates federal awardees by recipient and returns candidates ranked by agencyObligated with agencyAwardCount, mostRecentAwardDate, and sampleAwards; optionally screens the top candidates via sam_check_exclusions and drops active exclusions (excludeDebarred, default true). HONESTY: cert is AWARD-DERIVED (recorded on the firm's federal awards), NOT the SBA certification of record (which needs a keyed SAM Entity call) — verify active certification in SAM/SBS before teaming (stated in _meta). A bogus cert is rejected as invalid_input (the endpoint would silently return 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
certYesSocioeconomic certification (award-derived, NOT the SBA registry of record). One of: small_business, 8a_program_participant, woman_owned_business, women_owned_small_business, economically_disadvantaged_women_owned_small_business, service_disabled_veteran_owned_business, veteran_owned_business, historically_underutilized_business_firm (HUBZone).
pageNo1-based page index (default 1).
limitNoCandidates per page (default 25, max 50).
naicsNoNAICS code to scope the search (e.g. '541512').
agencyNoAwarding agency canonical toptier name (e.g. 'Department of Veterans Affairs'). Use usas_lookup_agency to resolve abbreviations.
minAwardsNoMinimum scanned award count for a firm to be listed (default 1).
scanPagesNoAward-value-sorted pages (100 rows each) to scan before aggregating by recipient (default 4, max 10).
screenCapNoMax candidates to exclusion-screen per page (default 10, max 25).
subagencyNoAwarding sub-agency name. Requires `agency` to also be set (a subagency alone is dropped).
lookbackYearsNoAction-date lookback window in years (default 3).
excludeDebarredNoScreen the top-ranked candidates via sam_check_exclusions and drop active exclusions (default true; bounded + disclosed in _meta).

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, openWorldHint), the description discloses that results are ranked by agencyObligated with specific fields, that top candidates are optionally screened via sam_check_exclusions with default debarred exclusion, and that a bogus cert triggers invalid_input. This adds valuable behavioral context beyond what annotations provide.

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 well-structured with a clear purpose statement, details on ranking and filtering, and a notable honesty section. While somewhat lengthy, every sentence contributes meaning, and it avoids unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 11 parameters and no output schema, the description adequately explains the return structure (ranked candidates with specific fields) and error behavior (invalid_input). It also notes meta field details for exclusion screening, making it fairly complete for an AI agent's needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for all 11 parameters. The description adds marginal value by explaining the cert limitation and that subagency requires agency, but the schema already covers the basics. Baseline 3 is appropriate.

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 is for 'small-business teaming-partner discovery' using specific criteria (certification, NAICS, agency award history), and distinguishes it from sibling tools like usas_search_recipients and usas_search_awards by mentioning the certification-based filtering and integrity screening.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on usage, including that the cert is award-derived (not SBA certification) and instructs users to verify active certification in SAM/SBS before teaming. It implicitly advises against using this tool when actual SBA certification status is needed, though it does not explicitly name alternative tools like sam_lookup_organization.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

usas_spending_over_timeA
Read-only

Time-series aggregation of federal CONTRACT spending (award types A/B/C/D — grants, IDVs, loans, and other obligation types are EXCLUDED, matching the other usas_search_*_spending tools; disclosed in _meta). Group by fiscal_year / quarter / month, filter by agency / NAICS / set-aside. Use for 'how has VA 541512 contract spending trended over the past 5 years' — returns yearly/quarterly/monthly $ rollups of contract obligations (grantObligations/idvObligations are null, NOT 0, to avoid implying an agency has no grant/IDV spending).

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNo
naicsNo
agencyNo
setAsideNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint. The description adds behavioral context beyond annotations by specifying that grantObligations/idvObligations are returned as null (not 0) to avoid misleading implications. This is a meaningful behavioral trait. It also mentions that the exclusion of non-contract types is disclosed in _meta.

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, well-structured paragraph that front-loads the core purpose, then adds exclusions, behavior, and a usage example. It is relatively concise at ~100 words. Minor parenthetical aside about _meta adds a bit of density but is relevant.

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?

The description covers the tool's output (time-series rollups), key parameters, null behavior, and gives a usage pattern. Given there is no output schema, this is fairly complete. It could mention whether grouping is required or optional, or note any pagination or result limits, but the core functionality is well-described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides a usage example that demonstrates how to use agency ('VA') and NAICS ('541512') parameters, adding context beyond the schema. However, with 0% schema description coverage, the description does not fully explain each parameter's format or constraints (e.g., agency is a string but no example of valid codes, NAICS as a string but no length). It lists the group enum options but doesn't elaborate on them.

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 purpose as 'Time-series aggregation of federal CONTRACT spending' and explicitly excludes non-contract award types (grants, IDVs, loans), distinguishing it from siblings like usas_search_agency_spending or grants_search. It uses a specific verb ('aggregate') and resource ('federal contract spending').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete usage example ('how has VA 541512 contract spending trended over the past 5 years') and explains what it returns. It implies when not to use by excluding grants/IDVs/loans. However, it does not explicitly name alternative sibling tools for those excluded types beyond noting that it matches 'other usas_search_*_spending tools'.

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. 124 tool updatesv1.12.0
    • Addedapi_key_status
    • Addedarcgis_feature_query
    • Addedarcgis_hub_discover_datasets
    • Addedbea_regional_data
    • Addedbls_oews_wages
    • Addedbls_qcew
    • Addedbls_timeseries
    • Addedbonfire_list_organizations
    • Addedbonfire_search_opportunities
    • Addedcbp_border_wait_times
    • Addedcensus_business_patterns
    • Addedcensus_geocode_address
    • Addedcensus_geographies_by_coordinates
    • Addedcisa_kev_lookup
    • Addedckan_discover_datasets
    • Addedckan_query
    • Addedclinicaltrials_facet_counts
    • Addedclinicaltrials_get_study
    • Addedclinicaltrials_search_studies
    • Addedcms_dmepos_suppliers
    • Addedcms_facility_directory
    • Addedcms_hospital_compare
    • Addedcms_medicare_provider_services
    • Addedcms_query_dataset
    • Addedcms_revoked_providers
    • Addedcms_search_datasets
    • Addedcongress_get_bill
    • Addedcongress_search_bills
    • Addedcourtlistener_search_opinions
    • Addedcpsc_recalls
    • Addedcve_lookup
    • Addeddatagov_search_datasets
    • Addeddol_get_dataset
    • Addeddol_list_datasets
    • Addedecfr_get_section
    • Addedecho_facility_report
    • Addedecho_search_facilities
    • Addededgar_company_concept
    • Addededgar_company_facts
    • Addededgar_company_filings
    • Addededgar_daily_filing_index
    • Addededgar_filing_index
    • Addededgar_full_text_search
    • Addededgar_lookup_cik
    • Addededgar_xbrl_frames
    • Addedepa_tri_facilities
    • Addedfac_get_findings
    • Addedfac_search_audits
    • Addedfar_clause_lookup
    • Addedfar_compliance_matrix
    • Addedfar_search
    • Addedfdic_bank_failures
    • Addedfdic_branch_deposits
    • Addedfdic_industry_summary
    • Addedfdic_institution_financials
    • Addedfdic_institution_history
    • Addedfdic_risk_ratios
    • Addedfdic_search_institutions
    • Addedfed_register_public_inspection
    • Addedfeedback
    • Addedfema_disaster_declarations
    • Addedfema_search_hazard_mitigation
    • Addedfema_search_public_assistance
    • Addedfpds_search_awards
    • Addedfred_search_series
    • Addedfred_series_observations
    • Addedgao_protest_lookup
    • Addedgovinfo_get_package
    • Addedgovinfo_list_collections
    • Addedgovinfo_search_packages
    • Addedgsa_benchmark_labor_rates
    • Addedgsa_perdiem_rates
    • Addedhts_lookup
    • Addedlda_search_filings
    • Addednhtsa_complaints
    • Addednhtsa_recalls
    • Addednih_reporter_search_projects
    • Addednist_800_53_controls
    • Addednonprofit_financials
    • Addednonprofit_search
    • Addednppes_lookup_provider
    • Addednsf_get_award
    • Addednsf_search_awards
    • Addednws_active_alerts
    • Addedofac_screen_entity
    • Addedopen_checkbook_search
    • Addedopenfda_device_clearances
    • Addedopenfda_drug_approvals
    • Addedopenfda_enforcement
    • Addedopengov_list_governments
    • Addedopengov_search_solicitations
    • Addedregulations_get_docket
    • Addedregulations_search_comments
    • Addedregulations_search_dockets
    • Addedregulations_search_documents
    • Addedsam_check_exclusions
    • Addedsam_fetch_attachment_text
    • Addedsam_get_wage_rates
    • Addedsam_integrity_lookup
    • Addedsam_lookup_notice_fields
    • Changedsam_search_opportunities1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Page offset into the result set (default 0).",
        +  "type": "number"
        +}
    • Addedsam_search_shaping
    • Addedsam_search_wage_determinations
    • Addedsba_size_standard
    • Addedsearch_gov_domains
    • Addedsocrata_discover_datasets
    • Addedsocrata_query
    • Addedtableau_view_csv
    • Addedtreasury_avg_interest_rates
    • Addedtreasury_debt_to_penny
    • Addedtreasury_monthly_statement
    • Addedtreasury_query_dataset
    • Addedusas_analyze_incumbent
    • Addedusas_disaster_spending
    • Addedusas_list_disaster_codes
    • Changedusas_search_cfda_spending1 field changed
      • addedInput schema / properties / agency / description
        Added value: +"Canonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency."
    • Changedusas_search_expiring_contracts1 field changed
      • removedInput schema / properties / fiscalYear
        Removed value: -{
        -  "type": "number"
        -}
    • Changedusas_search_federal_account_spending1 field changed
      • addedInput schema / properties / agency / description
        Added value: +"Canonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency."
    • Changedusas_search_psc_spending1 field changed
      • addedInput schema / properties / agency / description
        Added value: +"Canonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency."
    • Addedusas_search_recompetes
    • Changedusas_search_state_spending1 field changed
      • addedInput schema / properties / agency / description
        Added value: +"Canonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency."
    • Changedusas_search_subagency_spending1 field changed
      • addedInput schema / properties / agency / description
        Added value: +"Canonical agency NAME (e.g. 'Department of Veterans Affairs'), NOT a toptier code — this filter matches by name; a numeric code silently matches nothing. Resolve via usas_lookup_agency / usas_list_toptier_agencies."
    • Changedusas_search_subawards2 fields changed
      • removedInput schema / properties / primeRecipientName
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / subRecipientName
        Added value: +{
        +  "type": "string"
        +}
    • Addedusas_search_teaming_partners
  2. 36 tool updatesv0.2.1
    • First observedecfr_list_titles
    • First observedecfr_search
    • First observedfed_register_get_document
    • First observedfed_register_list_agencies
    • First observedfed_register_search_documents
    • First observedgrants_get_opportunity
    • First observedgrants_search
    • First observedsam_attachment_url
    • First observedsam_fetch_description
    • First observedsam_get_opportunity
    • First observedsam_lookup_organization
    • First observedsam_search_opportunities
    • First observedusas_autocomplete_naics
    • First observedusas_autocomplete_recipient
    • First observedusas_get_agency_awards_summary
    • First observedusas_get_agency_budget_function
    • First observedusas_get_agency_profile
    • First observedusas_get_award_detail
    • First observedusas_get_recipient_profile
    • First observedusas_glossary
    • First observedusas_list_toptier_agencies
    • First observedusas_lookup_agency
    • First observedusas_naics_hierarchy
    • First observedusas_search_agency_spending
    • First observedusas_search_awards
    • First observedusas_search_awards_by_recipient
    • First observedusas_search_cfda_spending
    • First observedusas_search_expiring_contracts
    • First observedusas_search_federal_account_spending
    • First observedusas_search_individual_awards
    • First observedusas_search_psc_spending
    • First observedusas_search_recipients
    • First observedusas_search_state_spending
    • First observedusas_search_subagency_spending
    • First observedusas_search_subawards
    • First observedusas_spending_over_time

TDQS

A3.9/5.0
Disambiguation5/5

Each tool targets a distinct data source or operation, with very detailed descriptions that explicitly differentiate overlapping areas (e.g., USAS vs SAM vs Grants.gov). The rare potential confusions (e.g., multiple 'search' tools) are resolved by naming prefixes and contextual descriptions.

Naming Consistency4/5

Tools consistently use a `source_verb_noun` pattern (e.g., usas_search_awards, sam_get_opportunity). Minor deviations exist (e.g., `feedback` vs `api_key_status`), and some verbs vary ('search' vs 'lookup' vs 'get'), but the overall pattern is predictable and domain-grouped.

Tool Count2/5

152 tools is extremely large for a single MCP server, covering a vast range of federal data domains. While each tool serves a distinct purpose, this number may overwhelm agents and suggests the server is trying to be too many things at once.

Completeness4/5

The tool surface is remarkably broad, covering federal spending, procurement, regulations, healthcare, environmental data, and more. Minor gaps exist (e.g., no tools for USDA or Department of Education), but the coverage is impressive for a single server.

Maintenance

ActivitySlowing
ResponsivenessSyncing

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
    Not graded
    quality
    F
    maintenance
    An MCP server for the Congress.gov API that consolidates 91 operations into 6 comprehensive legislative tools that can be used by any MCP client (i.e. Claude Desktop), or MCP-compatible AI agent, to query and reason about congressional data.
    14
    1
    JavaScript
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    An MCP server for interacting with the USAspending.gov API, supporting local use with Claude Desktop and cloud deployment with login.gov authentication.
    3
    10
    -
  • A
    license
    A
    quality
    B
    maintenance
    GovToolsPro MCP Server — an MCP server that gives Claude and other AI clients workflow tools for US federal contractors: go/no-go scoring, incumbent intelligence (USAspending + FPDS), teaming-partner search, recompete prediction, Navy NECO lookup, and SAM.gov solicitation retrieval. It returns synthesized decisions rather than raw data, so contractors and capture teams can triage opportunities d
    10
    54
    2
    MIT
  • F
    license
    A
    quality
    B
    maintenance
    A production-quality MCP server that exposes the official eCFR API as structured tools for AI-driven contract compliance, enabling retrieval of relevant Code of Federal Regulations by clauses extracted from contracts.
    8
    -

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/cliwant/mcp-sam-gov'

If you have feedback or need assistance with the MCP directory API, please join our Discord server