mcp-sam-gov
This server is a keyless-first MCP toolkit (152 tools across 54 public US federal and state/local data sources) for government contracting, spending, regulation, and counterparty vetting.
Opportunities & solicitations — search SAM.gov/Grants.gov opportunities, read full RFP bodies, SOWs, POCs, and attachment text; pre-solicitation shaping radar
Spending & competition — USAspending/FPDS award searches, agency × NAICS share-of-wallet, individual awards, subawards, recompete radar, incumbent analysis, teaming-partner discovery
Entity & partner vetting — OFAC sanctions screening, SAM exclusions/debarment, Federal Audit Clearinghouse findings, FDIC bank financials/risk ratios/failures, EPA ECHO compliance and TRI
Product safety & recalls — FDA enforcement, 510(k) clearances, drug approvals, NHTSA recalls/complaints, CPSC recalls
Litigation & courts — GAO bid-protest decisions and federal court opinions (CourtListener)
Financial & nonprofit diligence — SEC EDGAR filings/facts/XBRL, IRS 990 nonprofit financials (ProPublica)
Regulatory & compliance — Federal Register, Regulations.gov, eCFR, FAR/DFARS clause lookup with Section L/M compliance matrices, Congress.gov, GovInfo, SBA size standards
Pricing, labor & fiscal — GSA CALC labor-rate bands, SCA/Davis-Bacon wage determinations, BLS CPI/OEWS/QCEW, FRED/BEA/Census economics, Treasury debt and monthly statement, per-diem rates, HTS tariff lookup
Health & research — NIH RePORTER, NSF awards, ClinicalTrials.gov, CMS Open Payments, NPPES provider lookup, Medicare utilization and hospital quality, CMS facility/supplier/revocation data
Cyber compliance — NVD CVE lookup, CISA KEV with remediation due dates, NIST 800-53 controls
State/local (SLED) procurement — OpenGov, Bonfire, ArcGIS, Socrata, CKAN, and Tableau portals for live solicitations, checkbooks, contracts, and vendor payments
Grants, disasters & datasets — Grants.gov search, FEMA disaster/mitigation/assistance data, NWS alerts, data.gov dataset discovery, .gov domain registry
Server utilities — api_key_status to check configured keys and feedback to generate GitHub issue links
Provides integration with ArcGIS for accessing state/local government procurement bids and awarded contracts, including feature services and hub data.
@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. 152 tools across 54 data sources — keyless-first: only 4 sources (Census business-patterns, FRED, BEA, and DOL's data endpoint) need a free key; the other 50 need none. Works today, in any AI agent.
Independent project — not affiliated with, endorsed by, or sponsored by SAM.gov, the U.S. General Services Administration (GSA), or any government agency.
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: Contracting Officer <co.name@example.gov> +1-XXX-XXX-XXXX
Set-aside: Total Small Business
Attachments: 1 ↓ 36C24526Q0460_1.docx (172 KB)
SOW preview: "RFQ# 36C24526Q0460 — Bulk Oxygen Tank Rental, Fill, Telemetry…" No API key, registration or signup for 147 of the 152 tools. 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 |
|
5+ separate vendor APIs / scrapers | 1 unified surface, 152 tools across 54 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), one Tableau Server Guest view (Montana), one Socrata Open Expenditures checkbook (South Dakota) |
🎓 Grants & datasets | "Cybersecurity grants posted in the last 30 days; discover federal open datasets" | Grants.gov, data.gov |
152 tools across 54 data sources — keyless-first: only 4 sources (Census business-patterns, FRED, BEA, and DOL's data endpoint) need a free key; the other 50 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.
Download
mcp-sam-gov.mcpbfrom the latest release.Double-click the file. Claude Desktop opens with an "Install Extension" dialog.
Click Install.
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-govThis installs the MCP server plus a SKILL.md workflow guide that teaches Claude when + how to use each of the 152 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.
No global install? Every host config below also has an npx variant (npx -y @cliwant/mcp-sam-gov) that skips the clone and npm install -g. It only needs Node.js.
⚪ 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-builtThen 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
Each host below shows two variants. Use one of them:
Global install:
"command": "mcp-sam-gov". This works only afternpm install -g(Path 3) has put themcp-sam-govbinary on your PATH.No global install (npx):
"command": "npx", "args": ["-y", "@cliwant/mcp-sam-gov"]. This needs only Node.js. npx downloads the package from npm on first run and caches it.
Package name: the npm package is scoped:
@cliwant/mcp-sam-gov.mcp-sam-govis only the name of the binary that a global install puts on your PATH. No unscopedmcp-sam-govpackage exists on npm, sonpx -y mcp-sam-govfails with a 404. Usenpx -y @cliwant/mcp-sam-gov.
Claude Desktop
%APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
Global install:
{
"mcpServers": {
"sam-gov": { "command": "mcp-sam-gov" }
}
}No global install (npx):
{
"mcpServers": {
"sam-gov": { "command": "npx", "args": ["-y", "@cliwant/mcp-sam-gov"] }
}
}On Windows, if the server fails to start with spawn npx ENOENT in %APPDATA%\Claude\logs\mcp*.log, wrap npx in cmd /c:
{
"mcpServers": {
"sam-gov": { "command": "cmd", "args": ["/c", "npx", "-y", "@cliwant/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 (152 tools)".
Claude Code
Per-project .mcp.json, global install:
{ "mcpServers": { "sam-gov": { "command": "mcp-sam-gov" } } }No global install (npx):
{ "mcpServers": { "sam-gov": { "command": "npx", "args": ["-y", "@cliwant/mcp-sam-gov"] } } }Or with the CLI:
# global install
claude mcp add sam-gov mcp-sam-gov
# no global install (npx)
claude mcp add sam-gov -- npx -y @cliwant/mcp-sam-govCodex CLI
~/.codex/config.toml:
Global install:
[mcp_servers.sam-gov]
command = "mcp-sam-gov"
args = []No global install (npx):
[mcp_servers.sam-gov]
command = "npx"
args = ["-y", "@cliwant/mcp-sam-gov"]Cursor
Settings → MCP → Add new MCP server. Global install:
{ "mcpServers": { "sam-gov": { "command": "mcp-sam-gov" } } }No global install (npx):
{ "mcpServers": { "sam-gov": { "command": "npx", "args": ["-y", "@cliwant/mcp-sam-gov"] } } }Continue
~/.continue/config.json, global install:
{
"experimental": {
"modelContextProtocolServer": {
"transport": { "type": "stdio", "command": "mcp-sam-gov" }
}
}
}No global install (npx):
{
"experimental": {
"modelContextProtocolServer": {
"transport": { "type": "stdio", "command": "npx", "args": ["-y", "@cliwant/mcp-sam-gov"] }
}
}
}Gemini CLI
~/.gemini/settings.json, global install:
{ "mcpServers": { "sam-gov": { "command": "mcp-sam-gov" } } }No global install (npx):
{ "mcpServers": { "sam-gov": { "command": "npx", "args": ["-y", "@cliwant/mcp-sam-gov"] } } }VS Code
Add a .vscode/mcp.json at your project root (VS Code uses "servers", not "mcpServers"):
{
"servers": {
"sam-gov": {
"command": "npx",
"args": ["-y", "@cliwant/mcp-sam-gov"]
}
}
}Or use the one-click badge at the top of this page to install directly from your browser.
Kiro
Use the one-click badge at the top of this page to add the server. Kiro opens an install dialog pre-filled with the npx command.
Anything else
If your host speaks MCP over stdio, point it at mcp-sam-gov (global install) or at npx -y @cliwant/mcp-sam-gov (no global install). 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)"
Trends & aggregation
"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, GSA per-diem, 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 |
| Required |
| |
| Required | the 2 FRED tools (no keyless tier — throw without it) | |
| Required |
| |
| Required for data |
| |
| Optional | higher limits on all api.data.gov sources (Regulations.gov, Congress.gov, GovInfo, FAC, data.gov catalog, GSA per-diem) — lifts the shared | |
| Optional | authenticated SAM.gov v2 search + the organization-name filter | |
| Optional | higher rate limit on | |
| Optional | the BLS v2 tier (~500 queries/day vs keyless ~25/day) | |
| Optional | a higher NVD rate limit ( | |
| Optional | higher openFDA rate limit ( | |
| Optional | higher CourtListener rate limit ( | |
| Optional | higher Socrata throttling limits |
Two ways to set any key — pick one:
Host env block — the
"env": { … }object shown in the examples above.A
.envfile 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-hereThe server auto-loads
.envat startup. A real environment variable always wins over.env(standard precedence), and.envis 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.
Choosing toolsets (smaller context)
By default all 152 tools load — about 74k tokens per session. Clients that pay the full context cost (Claude Desktop, Cursor, raw API) can cut that significantly by loading only the toolsets relevant to the task.
Set the MCP_SAM_GOV_TOOLSETS environment variable to a comma-separated list of toolset names (case-insensitive). Leave it blank (or set it to all) to restore all tools.
Token counts are approximate, measured as the compact JSON character count of each tools/list entry divided by 4.
feedback and api_key_status are always loaded in every profile (they help agents report problems and check key health regardless of which toolset is active).
Toolset | Tools | Approx tokens | What it covers |
| 60 | ~17k | SAM.gov discovery/attachments/wage-determinations/exclusions/integrity; Grants.gov; all USAspending; FPDS; GAO; FAR/eCFR/Federal Register; SBA; OFAC screening; GSA labor-rate benchmarks; |
| 13 | ~7k | State/local (SLED) procurement: OpenGov, Bonfire, ArcGIS, Socrata, data.gov/CKAN, Tableau, Open Checkbook, search.gov domains |
| 16 | ~10k | Partner due-diligence: FAC, FDIC, EPA ECHO/TRI, CourtListener, nonprofit (IRS 990), Senate LDA lobbying |
| 8 | ~5k | SEC EDGAR financial filings and XBRL frames |
| 9 | ~4k | Regulations.gov, Congress.gov, GovInfo |
| 15 | ~9k | GSA per-diem, BLS, Treasury, BEA, Census business-patterns, FRED, DOL, USITC HTS |
| 17 | ~12k | CMS, NPPES, NIH, NSF, ClinicalTrials.gov, openFDA |
| 3 | ~2k | NHTSA vehicle recalls, CPSC consumer-product recalls |
| 8 | ~5k | Census geocode, FEMA disasters, NWS alerts, CBP border wait times, data.gov catalog |
| 3 | ~2k | NVD CVE, CISA KEV, NIST SP 800-53 |
all | 152 | ~74k | Everything (default) |
Config examples:
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"sam-gov": {
"command": "npx",
"args": ["-y", "@cliwant/mcp-sam-gov"],
"env": { "MCP_SAM_GOV_TOOLSETS": "core,sled" }
}
}
}Claude Code (command line):
claude mcp add sam-gov -e MCP_SAM_GOV_TOOLSETS=core,sled -- npx -y @cliwant/mcp-sam-govClaude Desktop bundle (.mcpb / manifest user_config): set the Toolsets field in the extension settings dialog (blank = all).
If you call a tool that belongs to an unloaded toolset, the server returns a structured tool_not_loaded error naming the toolset and the exact env var to set. The suggested value is the union of your current loaded sets plus the needed set (e.g. MCP_SAM_GOV_TOOLSETS=core,vetting when you have core loaded and call a vetting tool) so your existing profile is not silently dropped. It never silently returns an empty result.
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 usesnpx @cliwant/mcp-sam-gov@latest.Opt out: set
MCP_SAM_GOV_NO_UPDATE_CHECK=1(orNO_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) andupstream_unavailable(an outage) — the error envelope carries areportfield: 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
feedbacktool, 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 (152 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 opportunitiessam_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 textsam_fetch_attachment_text— extract attachment text (RFP / SOW / Q&A / wage tables) from PDF + DOCX + text/HTMLsam_attachment_url— build the public download URL for an attachment resourceIdsam_lookup_organization— federal-organization id → canonical fullParentPathNamesam_lookup_notice_fields— batch-fill nulled naics/set-aside/PoP/deadline for 1–100 noticeIds from the opt-in GSA daily CSVgrants_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 × NAICSusas_search_individual_awards— line-item federal contracts (returns generatedInternalId)usas_get_award_detail— full award detail: period of performance, options, set-aside, competitionusas_search_awards_by_recipient— every contract a recipient won in an agency × NAICS sliceusas_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_contracts— deprecated alias ofusas_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-screenedusas_spending_over_time— contract-spending time series (fiscal_year / quarter / month)usas_search_agency_spending— spending broken down by awarding agencyusas_search_subagency_spending— break a parent agency down by sub-agency / officeusas_search_psc_spending— spending by Product Service Code (PSC)usas_search_cfda_spending— spending by CFDA grant-program codeusas_search_state_spending— spending by state / territoryusas_search_federal_account_spending— spending by federal account / Treasury Account Symbol (TAS)usas_search_recipients— recipient list with parent/child hierarchyusas_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 yearusas_list_toptier_agencies— all toptier agencies + current-FY obligationsusas_lookup_agency— resolve 'VA' / 'DHS' → canonical toptier name + 4-digit codeusas_autocomplete_naics— anti-hallucination NAICS guardusas_autocomplete_recipient— anti-hallucination recipient guardusas_naics_hierarchy— navigate the NAICS tree (2→4→6) + active-contract count per codeusas_glossary— 151 federal-spending termsusas_list_disaster_codes— list Disaster Emergency Fund Codes (DEFC): COVID-19, IIJA/infrastructure, and other emergency-appropriation tagsusas_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 screeningsam_check_exclusions— keyless SAM debarment/exclusion screening by name and/or UEI/CAGEsam_integrity_lookup— one-call integrity screen (exclusion verdict + honest FAPIIS pointer)fac_search_audits— Single Audit summaries from the Federal Audit Clearinghousefac_get_findings— drill into the audit-RISK findings for an entityfdic_search_institutions— search the FDIC-insured-institution directoryfdic_institution_financials— quarterly financial time-series for one institution (by cert #)fdic_risk_ratios— counterparty risk ratios for one institutionfdic_institution_history— structural-change event log (mergers, charter changes)fdic_branch_deposits— branch-deposit footprintfdic_bank_failures— historical bank failures & assistance transactionsfdic_industry_summary— industry & state banking-sector annual aggregatesecho_search_facilities— search EPA-regulated facilities by state with compliance/enforcement screeningecho_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 / yearnhtsa_complaints— NHTSA vehicle safety complaints by make / model / yearcpsc_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 CIKedgar_company_filings— a company's SEC filingsedgar_company_facts— curated XBRL financial facts for a fileredgar_company_concept— one filer × one XBRL concept × the complete reported time-seriesedgar_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–presentedgar_filing_index— bulk cross-filer filing index for a quarteredgar_daily_filing_index— per-day cross-filer filing index
fed_register_search_documents— search Federal Register documents by query / agency / type / datefed_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 referenceregulations_search_dockets— search Regulations.gov rulemaking docketsregulations_search_documents— search Regulations.gov rulemaking documents (rules, proposed rules, notices)regulations_search_comments— search public comments on rulemakingsregulations_get_docket— fetch one Regulations.gov docket by idecfr_search— full-text search across the entire CFR (titleNumber=48 for FAR); returns ranked snippets + ecfrUrlecfr_get_section— the FULL text of one CFR section by citation (any title; for FAR/DFARS preferfar_clause_lookup)ecfr_list_titles— all 50 CFR titles + last-amended datesfar_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 / legislationcongress_get_bill— one bill by congress / type / numbergovinfo_search_packages— search GovInfo (GPO-authoritative) packages in a collectiongovinfo_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 localitysam_get_wage_rates— prevailing-wage + fringe / H&W rate table parsed from a WD, plus the EO minimum-wage floorbls_timeseries— BLS time series (CPI-U / ECI escalation, PPI, employment) — the pricing/escalation layerbls_oews_wages— benchmark occupational wages & employment (BLS OEWS) by area × occupationbls_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 typetreasury_monthly_statement— Monthly Treasury Statement: receipts, outlays, deficit/surplus by monthtreasury_query_dataset— escape-hatch query over 7 confirmed Treasury Fiscal Data datasetsbea_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 projectsnsf_search_awards— awarded NSF research-grant awardsnsf_get_award— one NSF award by its numeric award idclinicaltrials_search_studies— federally-registered clinical studies with sponsor/funder enrichmentclinicaltrials_get_study— one clinical study by NCT id (incl. brief summary)clinicaltrials_facet_counts— exact per-value study-count distribution over the whole registrycms_search_datasets— discover CMS Open Payments (Sunshine Act) datasetscms_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 ratingscms_facility_directory— CMS nursing-home / home-health / hospice / dialysis facility directoriescms_dmepos_suppliers— CMS DMEPOS (durable medical equipment) supplier directory + Medicare spendcms_revoked_providers— CMS Medicare revocation / exclusion list (provider compliance vetting)
cve_lookup— look up NIST NVD CVE recordscisa_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 Schedulecbp_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 geographiesfema_disaster_declarations— FEMA disaster / emergency declarations by state, type, incident, yearfema_search_public_assistance— FEMA Public Assistance funded projectsfema_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 keywordsocrata_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 keywordckan_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 endpointsbonfire_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 27 US-gov ArcGIS REST feature layers: DC OCP PASS live solicitations; local-gov checkbooks/contracts; state DOT bid/award registers (TX / AK / IA / OK); 4 North Dakota DOT federal flex-funding award layers (NDDOT funding awards to local public agencies such as counties, townships and cities, not vendor contracts or winning bids; a proxy because ND's statewide checkbook and procurement portal aren't keyless-reachable)tableau_view_csv— fetch a curated US-gov Tableau Server Guest view's complete CSV export (keyless) and page over it; one view today: Montana DOA Contracts Awarded (~4,554 award records; freshness is set by the publisher and can lag)open_checkbook_search— row-level vendor-payment search over a curated Socrata Open Expenditures checkbook portal (keyless; exact-match year/vendor/department/expense-category filters); one portal today: South Dakota Open Checkbook (~740,980 payments, only the ~3 most recent fiscal years; freshness is set by the publisher and can lag, so sort by payment_date desc to see the newest date)
datagov_search_datasets— search the data.gov v4 catalog for federal open datasets across all publishing agenciessearch_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 catalogdol_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)feedback— returns a prefilled GitHub issue link for a bug report or feature request; you open and submit it yourself (the tool never posts anything)
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. 50 of the 54 sources (147 of the 152 tools) work with no API key; Census business-patterns, FRED, BEA and DOL's data endpoint need a free one. 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_URLto 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.mjsfrom any clean, non-blocked egress (a laptop / home / clean CI runner). It self-diagnoses per-source reachability, prints a reachability table, and writes amanifest.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 | Fully quit Claude Desktop (system tray on Windows / Quit menu on macOS) and reopen. Check |
| Confirm |
| The host started |
| npm bug with git-dep symlinks on Windows. Use the clone + |
| Previous failed install left dangling files. Run |
| The repo is now public — should not happen. If it does, try |
Tools return empty results | SAM.gov rate-limits aggressive callers. Wait 1 minute. Or set |
"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 is an independent open-source project. It is not affiliated with, endorsed by, or sponsored by the General Services Administration, SAM.gov, USAspending.gov, the Office of the Federal Register, the National Archives, Grants.gov, or any federal, state, or local government agency. It uses only publicly available government open-data endpoints; federal procurement, spending, and regulation data is in the public domain.
Available Tools
152 toolsapi_key_statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_queryARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Records per page (→ resultRecordCount), 1..1000, default 50. | |
| where | No | ArcGIS 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). | |
| offset | No | 0-based offset (→ resultOffset). Page with _meta.pagination.nextOffset; totalAvailable = the layer's exact match count. | |
| service | Yes | Service key (SSRF allowlist; 27 services). DC OCP PASS (solicitations/contracts/purchase_orders/payments). US local govs: Asheville NC, Bellevue WA, Miami-Dade FL×2, Suffolk County NY, Mat-Su AK, Las Vegas NV×2, Baltimore MD, Naperville IL, Worcester MA, Topeka KS (FY2015–23); TX/AK/IA/OK DOT bid/award registers. ND DOT flex-funding to local agencies (nddot_flex×4 — NOT vendor contracts). | |
| outFields | No | Comma-separated fields to return (default '*' = all). e.g. 'SOLICITATIONNUMBER,SOLICITATIONTITLE,DUE_DATE,NIGPCODE'. | |
| orderByFields | No | ArcGIS orderByFields, e.g. 'DUE_DATE DESC'. Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, openWorldHint=true), the description discloses extensive behavioral details: the exact meaning of totalAvailable (exact match count, never page length), handling of ArcGIS epoch millisecond date fields with negative/sentinel placeholders, explicit behavior for no-match (complete:true/returned:0), error throwing on 429/5xx/timeout, invalid_input/upstream for ArcGIS error bodies, and schema_drift for non-array features. It also details SSRF protections. This is far more than annotations provide and contradicts none of them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed with essential information. It is structured logically: purpose, data details, parameter explanations, honesty behaviors, and SSRF protections. It front-loads the purpose and key differentiator. While it could be more concise, every sentence adds value, and the length is justified by the complexity of the tool's behavior and error handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description fully covers the return format ('{ service, records:[{…attributes verbatim…}] } + honest _meta') and error behavior. It also explains the semantics of key parameters and the data quality rules. For a tool of this complexity, it leaves no critical gaps for an agent to call it correctly. The description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds substantial value: it explains the 'service' parameter as an allowlist ENUM with 27 services and describes the content of each, gives example 'where' clauses, explains 'outFields' default and usage, and clarifies 'limit' and 'offset' mapping to ArcGIS parameters. It also explains the meaning of the returned fields (e.g., date handling). This goes beyond the schema descriptions, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Query rows from a curated US-government ArcGIS REST feature layer' and positions it as 'the QUERY companion to arcgis_hub_discover_datasets', which differentiates it from the sibling discovery tool. It also enumerates specific services (DC PASS, etc.), giving a concrete resource scope. The verb 'Query' and the resource are specific, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the companion tool for discovery and implies that this tool is for querying rows from those discovered layers. It gives context on where the data lives ('SLED procurement/GIS data') and provides examples of usage (e.g., 'where' clauses). However, it doesn't contrast with other query tools like socrata_query or ckan_query, so it's not exhaustive about when to choose this over those. Still, it gives clear direction relative to its direct sibling, which is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arcgis_hub_discover_datasetsARead-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). Input query (→q, REQUIRED, ≥2 non-whitespace chars — broad whole-Hub scan 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): 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, and the global-platform caveat rides EVERY response. DISCOVERY ONLY — metadata + links; to read rows, arcgis_feature_query covers only its curated allowlist; other datasets must be followed on their own endpoint. HONESTY: totalAvailable = EXACT Hub match count (meta.total, NEVER data.length); pagination is 0-based offset; scalars null-never-empty, booleans null-preserving; genuine no-match → complete:true/returned:0; 429 → rate_limited / 5xx/timeout → upstream_unavailable THROWS; 200 non-JSON / non-array → schema_drift.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Datasets per page (→ page[size]), 1..100, default 20. | |
| query | Yes | Keyword 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). | |
| offset | No | 0-based record offset (→ page[start]=offset+1). Page with _meta.pagination.nextOffset; totalAvailable is the exact Hub match count. | |
| openDataOnly | No | When 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint=true and openWorldHint=true, the description adds extensive behavioral context: global non-US/non-governmental publishers, verbatim provenance fields, honest meta semantics, exact totalAvailable behavior, null/boolean handling, 429/5xx/timeout error modes, and schema-drift detection. It fully discloses what the tool can and cannot guarantee.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is densely packed and every sentence earns its place given the tool's complexity and the critical caveats around provenance and non-curated data. It front-loads the core purpose and then layers parameter semantics, discovery-vs-read guidance, and honesty guarantees in a readable, labeled structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the full return shape, pagination semantics, exact match-count behavior, error conditions, and the crucial global-platform caveat. For a discovery tool with open-world data and trust implications, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents parameters. The description still adds significant value by mapping each parameter to its Hub API equivalent (q, filter[openData], page[size], page[start]), stating defaults and constraints, and explaining real-world semantics such as the B2G relevance of openDataOnly=true.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Discover ArcGIS Hub datasets by keyword," and immediately positions it as the SLED/GIS open-data layer not covered by Socrata and CKAN. It clearly distinguishes this discovery tool from sibling data-access tools without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names explicit alternatives and selection conditions: Socrata/CKAN do not cover this layer, arcgis_feature_query covers only a curated allowlist for reading rows, and socrata_query is a curated official-source allowlist whereas this tool is explicitly not. This is ideal usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bea_regional_dataARead-only
Regional (county / state / MSA) GDP by industry and personal income from the BEA Regional Economic Accounts (apps.bea.gov/api/data, dataset 'Regional'). ★REQUIRES a free BEA_API_KEY — NO keyless tier; without the key this tool THROWS an honest config error (get one at https://apps.bea.gov/API/signup/; call api_key_status to check). Input: tableName (required, e.g. 'CAGDP2' county GDP, 'SAGDP2N' state GDP, 'CAINC1'/'SAINC1' personal income), geoFips (required — 'STATE', county FIPS like '06075', or MSA code), lineCode (required — integer industry line or 'ALL'), optional year ('LAST5' default, 4-digit year, or 'ALL'), frequency ('A'/'Q'). Returns { rows:[{ geoFips, geoName, timePeriod, lineCode, dataValue, unitOfMeasure, unitMult, noteRef }], notes:[{ noteRef, noteText }] } + honest _meta. ★HONESTY: a missing/invalid key OR ANY bad parameter returns HTTP 200 carrying an Error object — detected and surfaced as invalid_input carrying BEA's APIErrorDescription, NEVER a fake empty. dataValue parsed from BEA's comma-formatted string ('1,234,567' → 1234567). BEA suppression codes (NA)/(D)/(NM)/(L)/* → null (NEVER 0; genuine 0 stays 0). unitMult and unitOfMeasure reported ALONGSIDE raw dataValue — NOT pre-multiplied in. BEA returns the COMPLETE filter result (no pagination) → complete:true. Genuine empty Data:[] → honest empty; 5xx → THROWS; 200 non-JSON → schema_drift. Key rides ONLY in the UserID= query param.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | The data year: a 4-digit year (e.g. '2022'), 'LAST5' (the latest 5 years, default), or 'ALL'. Validated ^(\d{4}|LAST5|ALL)$. | |
| geoFips | Yes | The BEA GeoFips selector: 'STATE' (all states), a county FIPS like '06075', or an MSA code. Validated ^[A-Za-z0-9]{2,10}$. Required. | |
| lineCode | Yes | The 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. | |
| frequency | No | Data frequency: 'A' (annual, default) or 'Q' (quarterly). | |
| tableName | Yes | A 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, but the description adds substantial behavioral detail: key requirement and error behavior (honest config error, HTTP 200 with Error object surfaced as invalid_input), parsing of comma-formatted dataValue, mapping of suppression codes to null, non-pre-multiplied unitMult/unitOfMeasure, complete results without pagination, and handling of empty data, 5xx, and non-JSON responses. This far exceeds what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place. It starts with the core purpose, then critical key requirement, then parameter details, and finally return and error handling. The use of ★ markers highlights key points. It's structured with labels (Input, Returns, HONESTY) and is comprehensive, though it could be tightened without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, an external API key requirement, and complex error handling, the description covers all essential aspects: parameter formats with examples, return schema (rows and notes), data parsing behavior, suppression codes, pagination absence, and error scenarios. There is no output schema, so the description correctly carries the full burden of explaining return values. It is complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description adds valuable context by giving example table names (CAGDP2, SAGDP2N, CAINC1/SAINC1), explaining lineCode as integer or 'ALL', year options (LAST5, 4-digit, ALL), and frequency choices. It also clarifies the return format, which is not in the schema. This adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides regional GDP by industry and personal income from BEA Regional Economic Accounts, specifying the dataset and scope (county/state/MSA). It names example tables, making the purpose unambiguous. Though it doesn't name a sibling, it is distinct in this toolset as the only BEA regional data source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the tool requires a free BEA_API_KEY, explains there is no keyless tier, and directs users to api_key_status for checking. It also describes the input parameters and options, giving clear guidance on how to invoke it. It doesn't discuss alternatives because none exist for BEA regional data, but it covers prerequisites and invocation fully.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bls_oews_wagesARead-only
BLS OEWS occupational wage/employment benchmarking by area × occupation × datatype (keyless; api.bls.gov). Builds validated 25-char series IDs from structured inputs and batches them into one POST — NO year input (OEWS serves only the latest annual release). Inputs: occupation (curated enum, e.g. 'software_developer') or soc (raw 6-digit SOC, ^[0-9]{6}$ NO hyphen — at least ONE required); area (default 'national', 2-letter USPS state, or 5-digit CBSA metro code); datatype (default 'annual_mean'; annual_mean/annual_median/hourly_mean/hourly_median/employment). Returns { results:[{ area:{type,code,label}, occupation:{soc,key,label}, measure:{key,code,units}, value:number|null, valueUnavailable:bool, referenceYear, referencePeriod, footnotes, seriesId }] } + honest _meta. ★H1: OEWS is an ANNUAL point-in-time snapshot (reference May ); BLS API serves ONLY the most recent release, may lag ~1 year. NOT monthly/current-quarter. ★H2: a built-ID with no published value (occupation not surveyed or suppressed in that area) → value:null (NOT a tool error). ★H3: measure.units is set from datatype — annual_mean/annual_median=dollars/year; hourly_mean/hourly_median=dollars/hour; employment=count. NEVER mislabeled. ★H4: the API returns real numerics (no '#' top-code). area×occupation×datatype is capped at the tier's series cap (v1 25 / v2 50) and refused over-cap with the count named — never silently truncated; REQUEST_NOT_PROCESSED → rate_limited THROWS. Active tier (v1 keyless ~25/day or v2 BLS_API_KEY ~500/day) and series-cap limits disclosed.
| Name | Required | Description | Default |
|---|---|---|---|
| soc | No | One 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. | |
| area | No | One 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). | |
| datatype | No | One 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). | |
| occupation | No | One 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations readOnlyHint=true and openWorldHint=true, the description discloses a wealth of extra behavior: value:null instead of an error for suppressed/unsurveyed values (H2), measure.units is deterministic per datatype (H3), the API returns real numerics with no top-code (H4), rate limits and series caps with throwing behavior, and the promise of an 'honest _meta'. These are substantive behavioral details not derivable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded: the core purpose and key constraints appear before the detailed return shape and H1-H4 highlights. Every sentence carries essential caveats for a complex API. Some redundancy exists (e.g., 'NO year input' appears twice), but the structure (inputs → returns → highlighted notes) makes it navigable. It earns its length for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the return object: the result fields (area, occupation, measure, value, valueUnavailable, referenceYear, referencePeriod, footnotes, seriesId) and the '_meta' object. It also details error modes (rate_limited throws, invalid_input for unknown tokens), series caps, and the annual point-in-time nature. An agent has all necessary information to invoke the tool correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes all parameters. The description adds meaningful extra semantics: the mutual exclusivity of occupation/soc (at least one required), the 'NO hyphen' SOC constraint, the area resolution to areatype + zero-padded code with unknown tokens rejected, and the units mapping per datatype. While some details duplicate the schema, these additions clarify interpretation and edge cases enough to merit above-baseline scoring.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific identification: 'BLS OEWS occupational wage/employment benchmarking by area × occupation × datatype'. It clearly states what data the tool returns (wages/employment from the BLS OEWS API) and differentiates it from similar siblings like bls_timeseries by emphasizing 'NO year input (OEWS serves only the latest annual release)' and 'NOT monthly/current-quarter'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-not-to-use guidance: 'NOT monthly/current-quarter' and 'NO year input', which steers agents away from using it for time-series or historical queries. It also explains when to use occupation (curated, typo-proof) versus soc (raw long-tail passthrough) and provides defaults and required constraints. However, it never names alternative sibling tools directly, so the exclusion is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bls_qcewARead-only
BLS QCEW (Quarterly Census of Employment & Wages) — county×NAICS market-size / wages / location-quotient (keyless; data.bls.gov/cew Open Data Access CSV, un-rate-limited). Inputs: mode (REQUIRED {area,industry}); area (area_fips ^[0-9A-Za-z]{1,6}$ — REQUIRED for mode=area); industry (NAICS ^[0-9]{1,6}$ DIGIT-ONLY — REQUIRED for mode=industry; hyphenated 31-33 404s, use digit aggregate); year (REQUIRED), quarter (REQUIRED 1|2|3|4); client-side ownership/aggregationLevel/sizeCode; limit/offset. Returns { found, mode, 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_…}, overTheYear:{disclosed, disclosureCode, oty_…} }] }. ★DISCLOSURE HONESTY: each row has three disclosure codes (base/lq/oty). QCEW encodes SUPPRESSED values as literal 0 — under 'N': confidential emplvl/wage/avg-wkly → null (WITHHELD), estab count + oty-estab change stay DISCLOSED; under '-': WHOLE block → null; under blank: genuine reported/NEGATIVE 0 SURVIVES. NEVER blanket 0→null; null carries disclosed:false + raw disclosureCode; suppression note fires on any suppressed row. HONESTY: totalAvailable is EXACT filtered row count (fetch-once; QCEW does not paginate); per-tuple HTTP 404 → honest empty; 5xx/timeout THROW; 200 non-CSV/renamed header/wrong field-count → schema_drift THROW. Do-NOT-sum-across-agglvl/ownership note rides every response.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | The 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). | |
| mode | Yes | REQUIRED — 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. | |
| year | Yes | REQUIRED — 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. | |
| limit | No | Rows per page (CLIENT-SIDE window over the fetched-once slice), 1..1000, default 50. | |
| offset | No | 0-based row offset for CLIENT-SIDE pagination over the filtered set (QCEW has no server-side pagination), default 0. | |
| quarter | Yes | REQUIRED — the quarter '1'|'2'|'3'|'4' (all four live-servable). The annual 'a' is not enabled this build. | |
| industry | No | The 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. | |
| sizeCode | No | Optional CLIENT-SIDE filter on size_code. | |
| ownership | No | Optional 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). | |
| aggregationLevel | No | Optional 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Exceptional disclosure beyond the readOnlyHint/openWorldHint annotations. It explains the QCEW suppression semantics (literal-0 encoding, 'N' vs '-' vs blank handling, never blanket 0→null), exact error behavior (404→honest empty, 5xx/timeout→throw, schema_drift→throw), and the fetch-once pagination model. This goes far beyond the annotations' low burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but nearly every sentence earns its place given the tool's complexity — the 0→null disclosure trap, pagination honesty, and NAICS edge case are genuinely load-bearing for correct invocation. It is front-loaded with the identifying purpose. The formatting is a wall of text rather than structured sections, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema, this is exceptionally complete: it describes the return shape, the three disclosure codes per row, pagination semantics, error behaviors, and required/optional routing. Nothing an agent needs to call it correctly is missing; the complexity is fully matched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though schema coverage is 100% (baseline 3), the description adds high-value semantics: cross-conditional requirements (area REQUIRED for mode=area, industry REQUIRED for mode=industry), the hyphenated-NAICS trap, ownership code mappings (0/1/2/3/5), and the anti-double-counting guidance for aggregationLevel. It materially improves parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise statement of function — 'county×NAICS market-size / wages / location-quotient' — naming the resource (BLS QCEW), the data product, and the data source. The two slice shapes (area/industry) are spelled out, making it instantly distinguishable from sibling bls_timeseries and bls_oews_wages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides extensive when-to-use guidance nested in the parameter rules: when mode=area vs mode=industry, year coverage window, the explicit NAICS hyphenation pitfall ('31-33 404s'), and the aggregationLevel advice to filter to one agglvl_code. It lacks explicit exclusions naming alternatives, but the mode/parameter routing is thorough enough to qualify as clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bls_timeseriesARead-only
Fetch one or more BLS time-series over a year range (keyless v1 default; optional free BLS_API_KEY lifts to v2; api.bls.gov POST). At least one of series (curated enum key) or seriesId (raw ^[A-Z0-9]{1,25}$; covers 25-char OEWS IDs) is required; both may be combined. Optional startYear/endYear (defaults to active tier's span cap). Returns { series:[{ seriesId, key, meaning, units, observations:[{year, period, periodName, value:number|null, valueUnavailable:bool, footnotes:[{code,text}], latest:bool}], observationCount, coveredRange:{from,to} }] } + honest _meta. HONESTY: BLS '-' unavailable marker → value:null (NEVER 0); valueUnavailable:true on the observation + footnote reason lifted into _meta.notes so the gap is DISCLOSED, never silent. Each series carries its own units label — an ECI '…A' series is a 12-month PERCENT CHANGE, NOT an index level; CPI/PPI are index levels; CES nonfarm employment is thousands of persons. Do NOT compare values across series without reading each units label. status !== 'REQUEST_SUCCEEDED' THROWS: REQUEST_NOT_PROCESSED (v1 daily limit) → rate_limited retryable; REQUEST_FAILED → upstream_unavailable. Series count refused over active tier cap (v1: 25 series/~10yr; v2: 50 series/~20yr) — overflow is NEVER silently dropped. Span is CLAMPED to tier cap before the fetch and disclosed. totalAvailable is null (batch fetch has no upstream total). A typo'd seriesId returns an empty series with 'Invalid Series' upstream message — NOT a real available series. BLS_API_KEY rides ONLY in the POST body, never URL/label/_meta/log.
| Name | Required | Description | Default |
|---|---|---|---|
| series | No | One 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. | |
| endYear | No | Inclusive end year (1900..2027). Default: the current year. Must be ≥ startYear. | |
| seriesId | No | One 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,25}$ (uppercase alnum; punctuation/whitespace/lowercase rejected — SSRF + 'verify the ID' honesty). OEWS IDs are 25 chars (e.g. OEUN000000000000015125201). 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. | |
| startYear | No | Inclusive 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses far beyond annotations (readOnlyHint/openWorldHint): missing-value handling ('BLS '-' → value:null, NEVER 0'), units warnings ('ECI …A is a 12-month PERCENT CHANGE'), error conditions ('status !== REQUEST_SUCCEEDED THROWS'), tier caps ('overflow is NEVER silently dropped'), clamping, totalAvailable null, typo behavior, and API key placement. These are concrete behavioral traits that materially affect invocation and result interpretation. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with purpose and key constraintsaren't the core. Every unique behavioral detail (honesty, units, errors, clamping, typo handling) earns its place. However, it repeats some schema content verbatim (e.g., 'At least one of series/seriesId is required; both may be combined' and the charclass) which adds length without new value. Still, it is well-structured and not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with no output schema, yet the description fully compensates: it specifies the return shape (`series:[{seriesId, key, meaning, units, observations:[...]}]`), error statuses and retryability, tier caps and clamping, missing-value semantics, unit caveats, and even auth key transport. The only thing left to the schema is year-range boundsio, which schema already covers. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already rich: enum meanings, units, charclass for seriesId, defaults for startYear/endYear, and the requirement that at least one of series/seriesId must be provided. The description largely restates these constraints and adds only marginal parameter-level info such as the v1/v2 cap defaults (which are also covered by schema's 'clamped to tier cap' note). It adds value in the behavioral realm, not parameter semantics, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+object+scope: 'Fetch one or more BLS time-series over a year range.' It further disambiguates from siblings by referencing raw OEWS IDs and mentioning the BLS API, making it distinct from fred_series_observations or bls_qcew. The naming of curated vs raw series also clarifies the tool's two modes of operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use curated `series` keys vs raw `seriesId` passthrough, including examples like 'OEWS area×occupation, local-area unemployment LAUCN…, SA/regional CPI variants.' It also explains v1 vs v2 key usage and span clamping. However, it does not explicitly name sibling alternatives (e.g., bls_qcew or bls_oews_wages) or state when *not* to use this tool in favor of those, stopping short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bonfire_list_organizationsARead-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 186 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Orgs per page, 1..200, default 50. | |
| query | No | Case-insensitive name substring filter (client-side), e.g. 'county', 'ISD'. Optional. | |
| state | No | 2-letter US state filter (client-side), e.g. 'TX', 'CA'. Optional. | |
| offset | No | 0-based offset; page with _meta.pagination.nextOffset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint/openWorldHint, and the text goes further by disclosing that this is a curated, live-verified seed of 186 US orgs, that it is partial relative to Bonfire's ~900 orgs, and that totalAvailable is the exact filtered seed count. This prevents false expectations about completeness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by parameters, output shape, pipeline, and caveats in a logical order. Despite the density, every sentence adds needed information for a partial, non-obvious data source; there is no filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description supplies the return shape, pagination semantics, the downstream tool, and critical data-provenance caveats. An agent can decide whether the curated seed is sufficient and knows how to extend it, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the structured schema already documents all four parameters. The description restates filtering and pagination behavior but does not add materially new meaning beyond connecting the filters to the curated seed, so the high-coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('List'), a concrete resource ('US governments on Bonfire/Euna eProcurement platform'), and positions itself as 'the directory for bonfire_search_opportunities (keyless)'. This clearly distinguishes it from the many sibling search tools and even previews the output shape.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended pipeline: list organizations, then feed a result's `org` to bonfire_search_opportunities. It also gives explicit exclusions ('Bonfire has NO keyless org-list API... auth-gated, out of bounds') and a concrete extension path ('probe {slug}.bonfirehub.com/opportunities/rss to extend').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bonfire_search_opportunitiesARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| org | Yes | The 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. | |
| limit | No | Opportunities per page, 1..200, default 50. The RSS is the complete open set; this pages over it. | |
| offset | No | 0-based offset; page with _meta.pagination.nextOffset. totalAvailable = the exact open-opportunity count. |
TDQS
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.
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.
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.
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.
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.
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_timesARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max ports returned (default 100, max 200). | |
| border | No | Filter by border — case-insensitive substring, e.g. 'Canadian' or 'Mexican' (the feed labels ports 'Canadian Border' / 'Mexican Border'). | |
| offset | No | Zero-based page offset (default 0). | |
| portName | No | Filter by port name — case-insensitive substring, e.g. 'Laredo', 'Detroit'. |
TDQS
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.
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.
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.
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.
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.
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_patternsARead-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 check). 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). 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 source's $1,000-unit PAYANN); large-negative suppression sentinels map to null — NEVER a negative number and NEVER 0 (genuine 0 stays 0; CBP primarily uses noise-infusion + suppression flags, surfaced as reported); geoId/naicsCode/state are STRINGS (leading zeros survive). CBP returns the COMPLETE geography set (no pagination) → totalAvailable = row count, complete:true. Missing/invalid key → invalid_input (302 to Missing-Key page); header-only body → honest empty; 5xx → THROWS; 200 non-JSON → schema_drift. Key rides ONLY in the &key= query param.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | The 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). | |
| limit | No | OPTIONAL 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. | |
| naics | No | A 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}$. | |
| state | No | A 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}$. | |
| geography | No | The 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true and openWorldHint=true, but the description goes far beyond by dislosing: the tool throws config errors without key, honest handling of missing/invalid keys (invalid_input with 302), mapping of suppression sentinels to null (never negative or 0), that results are complete (no pagination), and potential schema_drift on non-JSON responses. It also clarifies that the key rides only in query param. This is exemplary behavioral disclosure, far exceeding what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but somewhat lengthy, with multiple clauses and parenthetical explanations. While it front-loads key requirements (API key) and facts, it could be tightened without losing clarity. It is not excessively wordy given the complexity, but it is not as crisp as it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 params, no output schema, external API quirks), the description covers all critical operational details: key requirement, error handling, data format nuances, pagination absence, and parameter dependencies. An agent can confidently and correctly invoke the tool with this description alone. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter's description is thorough, including validation and required relationships. The tool description adds value by giving examples (e.g., '5415') and clarifying optionality, but the schema already carries the essential meaning. Since coverage is high, baseline 3 is appropriate; the description slightly enhances but does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('market sizing'), a clear resource (Census CBP data by NAICS and geography), and lists the output fields. It distinguishes itself from sibling tools like census_geocode_address and census_geographies_by_coordinates by focusing on business patterns data. It fully communicates what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use the tool (market sizing) and provides critical usage context: mandatory API key, no keyless tier, where to get the key, how to check key status, and details for each parameter (e.g., county requires state, NAICS optional). It effectively guides the agent on when to invoke this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
census_geocode_addressARead-only
Resolve a one-line US address → matched address(es) + the Census GEOGRAPHIES for set-aside / place-of-performance analysis (US Census Geocoder, keyless; geocoding.geo.census.gov/geocoder/geographies/onelineaddress). 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 }. Each geography = { layerKey (raw vintage-versioned key), geoid (STRING — leading zeros survive, e.g. '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 with DISTINCT GEOIDs → BOTH surfaced (chosen + alternates[]) + a mandatory note (NEVER silently dropped). The resolved benchmark/vintage is echoed + a 'Current is a MOVING vintage' note. Invalid/missing benchmark/vintage → HTTP 400 THROWS (never fake-empty); outage/5xx THROWS. MANDATORY CAVEAT every response: these are a NOMINAL input, NOT an authoritative HUBZone / Opportunity-Zone / set-aside determination — feed censusTract.geoid / county.geoid to SBA's HUBZone map / Treasury's OZ-tract list.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | A 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. | |
| vintage | No | Geography 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. | |
| benchmark | No | Address-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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true, the description goes well beyond annotations: it discloses genuine-empty behavior, multi-match surfacing, historical vintage alternate geographies, HTTP 400 throwing on invalid input, and a mandatory caveat about non-authoritative set-aside determination. This is unusually thorough 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative, front-loading the core purpose before layering edge-case behavior and the mandatory caveat. It avoids fluff, though it does partially restate schema enum content and could be tightened with clearer sectioning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates fully by describing the return shape ({matches, matchedAddress, coordinates, geographies, etc.}), error behavior, edge cases, and the caveat about HUBZone/OZ determination. For a complex 3-parameter tool with vintage-dependent behavior, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents address, benchmark, and vintage. The description adds meaning by stating the 500-character limit, defaults for benchmark/vintage, the 'Current is a MOVING vintage' caveat, and the benchmark-vintage compatibility matrix fail-closed behavior -- all beyond what the enum descriptions alone convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb-resource pair: 'Resolve a one-line US address → matched address(es) + the Census GEOGRAPHIES'. It also names the specific government service and analysis use case (set-aside / place-of-performance), which clearly positions the tool relative to siblings like census_geographies_by_coordinates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the analysis context ('for set-aside / place-of-performance analysis') and gives practical guidance on address quality, empty results, and follow-up with SBA/Treasury data. It does not explicitly name alternative tools or state when NOT to use it, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
census_geographies_by_coordinatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Longitude — the Census API's own name for longitude (alias of `longitude`). | |
| y | No | Latitude — the Census API's own name for latitude (alias of `latitude`). | |
| vintage | No | Geography 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. | |
| latitude | No | Latitude (y), a finite number in [-90, 90]. Alias of `y`. e.g. 32.377612. | |
| benchmark | No | Address-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. | |
| longitude | No | Longitude (x), a finite number in [-180, 180]. Alias of `x`. e.g. -86.301883. |
TDQS
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.
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.
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.
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.
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.
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_lookupARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| cveId | No | Exact 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). | |
| limit | No | Max matches returned (default 100, max 1000). | |
| offset | No | Zero-based page offset (default 0). | |
| product | No | Case-insensitive substring filter on the product (e.g. 'Log4j', 'Exchange Server'). | |
| dueBefore | No | Keep only entries with dueDate < this ISO date (YYYY-MM-DD) — the CISA-mandated remediation deadline. | |
| addedSince | No | Keep only entries with dateAdded >= this ISO date (YYYY-MM-DD). | |
| vendorProject | No | Case-insensitive substring filter on the vendor/project (e.g. 'Microsoft', 'Apache'). | |
| ransomwareOnly | No | When true, keep only entries with knownRansomwareCampaignUse === 'Known'. |
TDQS
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.
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.
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.
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.
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.
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_datasetsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Keyword(s) to find datasets, e.g. 'procurement', 'checkbook', 'vendor'. | |
| host | Yes | Which 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). | |
| limit | No | Max datasets (packages) to return, 1..100, default 20. |
TDQS
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.
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.
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.
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.
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.
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_queryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Optional full-text search across the record (CKAN `q`). | |
| host | Yes | Which 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). | |
| sort | No | Optional sort, e.g. '_id asc' or 'amount desc'. A bad field ⇒ 409 ⇒ invalid_input. | |
| limit | No | Rows per page, 1..1000, default 100. | |
| offset | No | 0-based row offset for pagination, default 0. | |
| filters | No | Optional 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). | |
| resourceId | Yes | The datastore resource_id, a 36-char lowercase UUID e.g. 'bb82edc5-9c78-44e2-8947-68ece26197c5' (from ckan_discover_datasets, a datastoreActive:true resource). |
TDQS
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.
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.
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.
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.
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.
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_countsARead-only
Aggregate EXACT per-value study counts over the WHOLE ClinicalTrials.gov registry for 1..11 whitelisted ENUM fields (keyless; clinicaltrials.gov/api/v2/stats/field/values). Input fields (deduped): OverallStatus, StudyType, Phase, LeadSponsorClass (NIH/FED/OTHER_GOV/INDUSTRY/OTHER/NETWORK/INDIV/UNKNOWN/AMBIG — richer than the 4-value funderType in the search tool), Sex, DesignAllocation, DesignPrimaryPurpose, DesignInterventionModel, DesignMasking, DesignObservationalModel, DesignTimePerspective. Returns { facets:[{ field, fieldPath, valueType, uniqueValuesCount, missingStudiesCount, returned, truncated, overlapping, values:[{value, studiesCount}] }] } + honest _meta. HONESTY: each studiesCount/uniqueValuesCount is EXACT (typeof NUMBER — non-number → schema_drift); non-ENUM shape for a whitelisted field → schema_drift. _meta.totalAvailable/returned count DISTINCT FIELD VALUES, NOT studies — see facets[].values[].studiesCount / clinicaltrials_search_studies for study counts. Counts cover the ENTIRE registry and are NOT filterable — /stats/field/values rejects query./filter./pageSize (HTTP 400). returned<uniqueValuesCount → truncated (hard cap 250). Phase is ARRAY-valued (overlapping:true, MUST NOT sum counts); scalar fields partition the registry minus missingStudiesCount. High missingStudiesCount → buckets cover a MINORITY of the registry. MANDATORY CAVEAT: facet counts are distributions over trial REGISTRATIONS, NOT federal awards; LeadSponsorClass is the funding-SOURCE class, not a UEI-keyed award join. Unlisted field → invalid_input pre-fetch; 404/400/5xx → THROWS.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | 1..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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, but the description goes far beyond: it details exact counts (typeof NUMBER, schema_drift on non-number), potential truncation (hard cap 250), phase array overlapping counts that must not be summed, and the honest caveat about registrations vs awards. It also discloses the pre-fetch validation (invalid_input) and error behavior (404/400/5xx throws). 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and information-packed, with every sentence earning its place. It front-loads the core purpose (aggregate exact counts) before caveats. It could be slightly more concise by trimming redundant phrases, but for a complex tool with many caveats, this level of detail is justified. Loss of a point for slight length, but well-structured with clear sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one array parameter with enum values fully defined in schema, and annotations cover safety and open-world hints. The description provides all essential runtime behavior: return shape, exactness guarantees, truncation, non-filterability, phase overlap, and the critical caveat about registrations vs awards. Nothing missing for an agent to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description repeats the enum values and adds context about LeadSponsorClass being richer than the search tool's funderType, plus notes deduping and phase array arithmetic. It adds a little beyond schema but the schema already describes the fields thoroughly; it doesn't change the semantics fundamentally. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: aggregate exact per-value study counts over the whole ClinicalTrials.gov registry for specific enum fields. It names the API endpoint and explicitly contrasts with the search tool's funderType, distinguishing it from siblings like clinicaltrials_search_studies. The resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool (for whole-registry counts, not award data), and when NOT to (for study counts, use clinicaltrials_search_studies; for award-based distributions, use award tools). It also exclusions: non-filterable, rejects query/filter/pageSize, and highlights that it covers registrations not federal awards. This provides clear routing against alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clinicaltrials_get_studyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| nctId | Yes | NCT 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
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.
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.
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.
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.
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.
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_studiesARead-only
Search federally-registered clinical-research studies with LEAD-SPONSOR / COLLABORATOR / FUNDING-SOURCE enrichment (keyless; clinicaltrials.gov/api/v2/studies). Filters: query.term (broad free-text), sponsor (→query.spons, fuzzy NAME search), condition (→query.cond), location (→query.locn), overallStatus (frozen 14-value enum), funderType (frozen 4-value enum nih/fed/industry/other), pageSize (1..1000), pageToken (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 ALWAYS sent → totalAvailable = EXACT uncapped total (NEVER studies.length; missing/non-number totalCount → schema_drift). Pagination is OPAQUE cursor (nextCursor = nextPageToken back as pageToken; terminal = token absent; bad token → HTTP 400 THROWS). funderType re-validated in handler — UNLISTED value silently returns totalCount:0 at HTTP 200 (fake-empty trap) → invalid_input pre-fetch. funderType is an OVERLAPPING facet (counts MUST NOT be summed). MULTI-WORD query.term/sponsor/condition is AND-conjunctive (all tokens must co-occur — disclosed). Registered trial is NOT a federal award; leadSponsor.name is FREE TEXT (not a UEI) → NOMINAL name match only — disclosed every response. Genuine totalCount:0 → complete:true/total:0; bad overallStatus/pageToken → HTTP 400/404 THROWS; outage/5xx THROWS. Feed nctId to clinicaltrials_get_study.
| Name | Required | Description | Default |
|---|---|---|---|
| sponsor | No | Lead-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'. | |
| location | No | Study-location filter (→ query.locn), e.g. a country or city. LIVE-CONFIRMED to narrow. e.g. 'Germany'. | |
| pageSize | No | Studies per page, 1..1000, default 20 (ClinicalTrials.gov clamps a larger request to 1000). | |
| condition | No | Condition / disease filter (→ query.cond). MULTI-WORD is AND-conjunctive. LIVE-CONFIRMED to narrow. e.g. 'diabetes'. | |
| pageToken | No | Opaque 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. | |
| funderType | No | Funding-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.term | No | Broad 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'. | |
| overallStatus | No | Recruitment/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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint, and the description adds rich behavioral context: honest countTotal, opaque cursor pagination, loud-failure on bad tokens, fake-empty trap for unlisted funderType, AND-conjunctive multi-word tokens, nominal name matching, and error/outage behavior. This far exceeds what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed with essential behavioral details, and it is front-loaded with the core purpose. It is structured logically (filters, returns, honesty, pagination, facet caveats, errors, routing). While not concise in length, every sentence adds value, though a bit of redundancy exists (e.g., 'LIVE-CONFIRMED to narrow' repeated), so it earns a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully specifies the return structure, pagination, error modes, facet semantics, and handoff to clinicaltrials_get_study. Combined with the annotations, an agent has everything needed to call this tool correctly and interpret results, including edge cases like fake-empty and overlapping facets.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter well-documented, so the baseline is 3. The description adds extra value by clarifying live-confirmed narrowing, funderType overlapping facet semantics and its pre-fetch rejection, and the opaque cursor behavior, which go beyond the schema. However, much of the parameter meaning is already in the schema, so a 4 reflects the added nuance without over-scoring.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches federally-registered clinical-research studies with sponsor/collaborator/funding enrichment. It explicitly distinguishes itself from the sibling clinicaltrials_get_study by noting the briefSummary is excluded and to use that tool instead, making purpose and differentiation clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use the tool: for search with various filters, and when to hand off to clinicaltrials_get_study for full study details. It also explains pagination and error behavior, leaving no ambiguity about usage versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_dmepos_suppliersARead-only
Look up Medicare DMEPOS (Durable Medical Equipment) SUPPLIERS — supplier identity plus aggregate Medicare figures: HCPCS codes billed, beneficiaries served, claims, services, 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. Input: npi (10-digit) OR state (2-letter) — at least ONE is REQUIRED (all-empty query refused); 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). Aggregate/payment values are numeric-string → number|null (genuine 0 stays 0, absent → null); NPI/entityType/names are null-never-empty-string; supplierName coalesces Last_Name_Org + First_Name. Genuine no-match → honest empty; 4xx → invalid_input/not_found; 5xx → THROWS; 200 non-array/non-JSON → schema_drift. PUBLIC SUPPLIER-LEVEL AGGREGATE figures (no patient identifiers) for ONE annual vintage — NOT a fraud/quality/fitness determination.
| Name | Required | Description | Default |
|---|---|---|---|
| npi | No | A 10-digit supplier National Provider Identifier (→ Suplr_NPI), e.g. '1003000126'. Provide at least this OR `state`. Validated ^\d{10}$. | |
| size | No | Max supplier rows to return (1–100, default 25). Offset-paginated. | |
| state | No | A 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}$. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description goes far beyond by disclosing honest error handling (totalAvailable from a separate stats query, never length-faked), null semantics (numeric-string → number|null, null-never-empty-string), error mapping (4xx vs 5xx vs schema_drift), and the public aggregate nature of the data. This is substantial transparency beyond the annotations, with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well-structured, with a clear opening sentence, input specification, output format, and honesty/error handling sections. Each sentence adds value; it is not bloated, though it could be slightly tightened. The front-loading of purpose and key constraints earns a high score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (aggregate data, pagination, honesty guarantees, error handling) and the absence of an output schema, the description is remarkably complete. It covers output fields, _meta, pagination, null handling, error codes, and data vintage. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a detailed description including validation regexes and the requirement that at least one of npi/state be provided. The description adds minimal extra parameter semantics—it reiterates the input logic and mentions pagination via _meta, but does not materially enhance understanding beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Look up') and resource ('Medicare DMEPOS SUPPLIERS') and enumerates exactly what is returned (identity plus aggregate figures). It distinguishes itself from the sibling cms_medicare_provider_services by explicitly calling itself the 'supply-side complement', leaving no ambiguity about which tool to choose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the input requirement (npi OR state, at least one) and references the complementary sibling, giving the agent a direct alternative. It also includes usage cautions ('NOT a fraud/quality/fitness determination') that help the agent decide appropriateness. The guidance is explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_facility_directoryARead-only
Medicare/Medicaid-certified healthcare facilities by type — nursing homes, home health agencies, hospices, or dialysis facilities — with name, address, city, state, zip, and ownership (CMS provider-data, keyless; data.cms.gov datastore-query API, four datasets). 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 (case-insensitive substring), size (1–100, def 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; hasMore = offset+returned < count. name/address/ownership column names DIFFER across the four datasets → 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 (NEVER an empty string, NEVER fabricated). facilityType is echoed on each row. Filters applied SERVER-SIDE (AND-combined) — nothing silently dropped. Genuine no-match → honest empty; invalid facilityType → invalid_input (enum-blocked); 4xx → invalid_input/not_found; 5xx → THROWS; 200 non-array or missing count/results → schema_drift. NOT a clinical-quality or fitness determination.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Max facility rows to return (1–100, default 25). Offset-paginated. | |
| state | No | An optional 2-letter US state/territory code (→ state, EXACT match), e.g. 'VA', 'TX'. Validated ^[A-Za-z]{2}$. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| facilityName | No | An optional facility-name fragment (case-insensitive SUBSTRING/contains match against the dataset's primary-name column). Allowed: letters/digits/space/& . , ( ) / ' - (≤100 chars). | |
| facilityType | Yes | REQUIRED — 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint/openWorldHint annotations: it documents exact count semantics for totalAvailable, the hasMore formula, per-dataset column coalescing, null-never-empty behavior, server-side AND filters, and precise error mapping (invalid_input, not_found, schema_drift, throws on 5xx). This gives an agent an unusually honest model of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly structured: purpose, inputs, return shape, honesty guarantees, error behavior, and caveat. It front-loads the core purpose and uses compact notation. A small amount of parameter detail repeats the input-schema descriptions, but almost every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only minimal annotations, the description carries the full burden of explaining return values and edge cases. It specifies the exact response shape ({ facilities: [...] } plus _meta), pagination, coalescing rules, absent-field behavior, and failure semantics. An agent has everything needed to call this tool and interpret its results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful parameter nuance: facilityType selects a dataset via a constant map and never enters the URL path, approximate row counts per enum value are provided, and filter semantics (EXACT state, case-insensitive substring facilityName) are reinforced. It does not fully duplicate the schema and adds operational meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Medicare/Medicaid-certified healthcare facilities by type' and enumerates the four facility types and returned fields. It distinguishes itself from broader CMS/socrata siblings by emphasizing the keyless datastore-query API and the four fixed datasets. The closing 'NOT a clinical-quality or fitness determination' further sharpens its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool is clearly scoped for searching four named CMS provider datasets by facility type, and the description explicitly states what it is not for ('NOT a clinical-quality or fitness determination'). However, it does not name specific sibling alternatives or give explicit when-to-use-this-vs-that routing, so it falls short of the highest bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_hospital_compareARead-only
Look up Medicare-certified hospitals by 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). Input: state (2-letter, EXACT) OR facilityName (case-insensitive substring) — at least ONE is REQUIRED (all-empty query 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, NEVER the returned-rows length. overallRating is CMS's 1–5 star rating; 'Not Available'/blank/non-numeric → null (NEVER 0). emergencyServices normalizes 'Yes'→true / 'No'→false / else null. IDs/names/addresses are null-never-empty-string. Genuine no-match → honest empty; 4xx → invalid_input/not_found; 5xx → THROWS; 200 non-array or missing count/results → schema_drift. Filters applied SERVER-SIDE (AND-combined). Summary star rating, NOT a clinical-quality or fitness determination.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Max hospital rows to return (1–100, default 25). Offset-paginated. | |
| state | No | A 2-letter US state/territory code (→ state, EXACT match), e.g. 'VA', 'CA'. Provide at least this OR `facilityName`. Validated ^[A-Za-z]{2}$. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| facilityName | No | A 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). | |
| hospitalType | No | An optional hospital-type filter (→ hospital_type, case-insensitive SUBSTRING/contains match), e.g. 'Acute', 'Critical Access'. Allowed: letters/digits/space/& . , ( ) / ' - (≤100 chars). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, and the description adds far beyond that: keyless access, totalAvailable-vs-count honesty, overallRating/emergencyServices normalization rules, null-never-empty-string behavior, precise error taxonomy (4xx→invalid_input/not_found, 5xx→throws, schema_drift), and server-side AND-filtering. This is exceptional disclosure with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every clause carries operational signal: source identity, filter rules, return shape, error mapping, normalization rules, and honest-data warnings. It is dense rather than padded, though a shorter version could front-load the core lookup intent even harder.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, 5 params, and a conditional requirement, an agent would normally be left guessing. This description specifies the exact return object shape, pagination via _meta, the error contract, and rating semantics, making the tool self-sufficient for correct invocation without any supplemental knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds meaning the schema hides: the conditional requirement (at least one of state/facilityName despite required:0), the hospitalType-not-sufficient constraint, and EXACT vs SUBSTRING match semantics that reinforce the schema examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb + resource ('Look up Medicare-certified hospitals') plus the exact dataset source (CMS Hospital Compare 'Hospital General Information', data.cms.gov provider-data API) and the returned field set. This distinguishes it from CMS siblings like cms_facility_directory and cms_medicare_provider_services without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context: the filter contract (state OR facilityName required, hospitalType alone insufficient) tells an agent exactly the scenario this tool serves. It does not explicitly name alternatives or when-not-to-use conditions, but the context is unambiguous enough that an agent can route to it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_medicare_provider_servicesARead-only
Medicare Part-B provider utilization — 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). 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'), size (1–100, def 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); if that count fails, totalAvailable is null + a disclosing note (never length-faked). hasMore = offset+returned < total. Aggregate/payment values: numeric-string → number|null (genuine 0 stays 0, absent → null, never 0-faked); NPI/HCPCS/names are null-never-empty-string. Genuine no-match → honest empty; 4xx → invalid_input/not_found; 5xx → THROWS; 200 non-array/non-JSON → schema_drift. PUBLIC PROVIDER-LEVEL AGGREGATE figures (no patient identifiers) for ONE annual vintage (dataset year disclosed in _meta) — utilization snapshot, NOT a fraud/quality/fitness determination.
| Name | Required | Description | Default |
|---|---|---|---|
| npi | No | A 10-digit National Provider Identifier (→ Rndrng_NPI), e.g. '1003000126'. Provide at least this OR `state`. Validated ^\d{10}$. | |
| size | No | Max provider-service rows to return (1–100, default 25). Offset-paginated. | |
| state | No | A 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}$. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| hcpcsCode | No | An optional HCPCS/CPT service code filter (→ HCPCS_Cd), e.g. '97110', 'G0463'. Validated ^[A-Za-z0-9]{1,10}$. | |
| providerType | No | An 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses extensive behavioral details: the honesty policy for totalAvailable (separate stats query, null with note on failure), hasMore logic, numeric-string conversion rules (genuine 0 stays 0, absent → null), null handling for identifiers, error handling (4xx/5xx/schema_drift), and dataset vintage disclosure. This exceeds 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, every sentence adds value: purpose, input requirements, optional filters, return format, honesty guarantees, and scope. The structure is logical, front-loading the core purpose and requirements before diving into details. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six parameters, no output schema, and no nested objects, the description compensates by fully specifying the return shape, pagination fields, error semantics, and data scope. It covers everything an agent needs to call the tool correctly and interpret results, including edge cases like genuine no-match and schema drift.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds critical semantic context not in the schema: the mandatory npi-or-state constraint with rationale (9.78M rows), the exact-match requirement for providerType, and the pagination behavior via offset and size. It also explains that providerType/hcpcsCode alone cannot scope the query, which the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving Medicare Part-B provider utilization data with specific metrics (services, beneficiaries, amounts). It distinguishes itself from generic CMS data tools by naming the exact dataset and emphasizing provider-level aggregates. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit input requirements (npi or state required, providerType/hcpcsCode alone insufficient) and clarifies what the tool is not (fraud/quality/fitness determination). However, it does not explicitly name alternative tools or state when to prefer this over siblings like cms_query_dataset, leaving some selection inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_query_datasetARead-only
Query a CMS Open Payments DKAN datastore distribution by datasetId + index (keyless; openpaymentsdata.cms.gov). Returns { datasetId, index, results (mode), fields:[{name,type,mysqlType,description}], rows:[…verbatim…] } + honest _meta. ★HONESTY: count is the EXACT grand total → totalAvailable=count + real offset pagination (NOT a page-length lower bound). conditions are server-side self-policing — BAD column → HTTP 400 → invalid_input; filtersDropped is ALWAYS empty (no silent-drop path). limit ≤ 500 is the HARD API cap (higher → invalid_input, no silent clamp). Every column is text, amounts arrive as STRINGS verbatim (null-never-0). ★results:false = COUNT/SCHEMA-discovery mode: no rows, pagination disabled (no livelock), EXACT count + column schema returned. Genuine {count:0} → honest empty; 400/404/HTML/5xx/timeout/missing schema/non-array → THROW. ★SSRF: datasetId (36-char UUID) + index are validated before URL interpolation. ★PII: Open Payments is PUBLIC transparency-BY-LAW data — bounded to targeted vetting (offset ≤ 2000 reach cap), NO enrichment, NO covered_recipient_npi→NPPES auto-join. NOT a conflict-of-interest / fitness / exclusion determination — cross-check SAM + OFAC + OIG-LEIE. The caveat + reach-cap disclosure ride EVERY response.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Distribution index (default 0 = the primary CSV). Also interpolates into the URL path (int 0..50). | |
| limit | No | Rows per page, 1..500, default 100. 500 is the HARD DKAN cap (the API 400s over it; this tool rejects >500 loudly). | |
| offset | No | 0-based row offset (default 0). ★POLICY reach cap ≤ 2000 (a deliberate targeted-lookup boundary — Open Payments names physicians + amounts); offset > 2000 ⇒ invalid_input. | |
| results | No | Default 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.) | |
| datasetId | Yes | REQUIRED — 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). | |
| conditions | No | Server-side filters (≤10, AND-combined) that provably narrow the EXACT count. Each either applies or the call errors — filtersDropped is always empty. | |
| properties | No | Optional column projection (snake_case column names). Omit for all columns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
In addition to readOnlyHint=true, it discloses error semantics (400/404/HTML/5xx/timeout → THROW), the exact-count vs page-length-lower-bound guarantee, the 500 hard cap, no silent filter drops, SSRF validation of UUID, and the 2000-offset PII reach cap. This far exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with caveats grouped under ★ markers and bolded labels. It is long, but the length is earned: each sentence covers a distinct behavioral guarantee or safety policy needed for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape ({datasetId, index, results, fields, rows, _meta}), explains both modes, covers errors, pagination, and policy caps, and disambiguates count semantics. The only minor omission is a detailed _meta field breakdown, which is not essential for calling the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description enriches every key parameter: datasetId's UUID grammar is framed as the SSRF guard, offset is tied to the PII reach cap, limit to the hard API cap, results to a discovery mode, and conditions to server-side self-policing with bad-column errors. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb ('Query'), a resource ('CMS Open Payments DKAN datastore distribution'), and the key identifiers ('datasetId + index'), and names the data source (keyless; openpaymentsdata.cms.gov). It clearly distinguishes this from discovery siblings like cms_search_datasets and socrata_query by being a datastore-level query, not a dataset search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description asserts when it is appropriate ('targeted vetting') and explicitly what it is NOT ('NO enrichment', 'NOT a conflict-of-interest / fitness / exclusion determination'), directing users to 'cross-check SAM + OFAC + OIG-LEIE'. It does not explicitly name a sibling discovery tool for finding datasetId, so it misses the explicit-alternative bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_revoked_providersARead-only
Search CMS's PUBLIC 'Revoked Medicare Providers & Suppliers' list — the legally-published register of Medicare enrollment revocations, with the revoked provider'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 lane in the same class as OFAC / SAM-exclusions lists. Input (ALL optional — the ~7K-row list is safe to page unfiltered): npi (10-digit), state (2-letter, 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 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 (found_rows), NEVER the returned-rows length (null + note if count fails). name coalesces ORG_NAME else FIRST_NAME + LAST_NAME; NPI/reasons/dates null-never-empty. Genuine no-match → honest empty; 4xx → invalid_input/not_found; 5xx → THROWS; 200 non-array/non-JSON → schema_drift. KEYLESS.
| Name | Required | Description | Default |
|---|---|---|---|
| npi | No | An optional 10-digit National Provider Identifier (→ NPI), e.g. '1003000126'. Validated ^\d{10}$. | |
| size | No | Max revocation rows to return (1–100, default 25). Offset-paginated. | |
| state | No | An optional 2-letter US state/territory code (→ STATE_CD, EXACT match), e.g. 'FL', 'CA'. Validated ^[A-Za-z]{2}$. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| lastName | No | An optional last-name filter (→ LAST_NAME, EXACT match). Allowed: letters/digits/space/. , ' - (≤100 chars). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description richly discloses behavior: totalAvailable comes from a separate stats sub-query and never the returned-rows length, name coalesces ORG_NAME over FIRST_NAME+LAST_NAME, NPI/reasons/dates are null-never-empty, no-match returns an honest empty result, 4xx/5xx/200-non-array cases are mapped, and the tool is keyless. This goes far beyond annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although dense, the description is well-structured and front-loaded: purpose, source, parameter semantics, return shape, honesty guarantees, and error behavior each earn their place. No filler is present, and the detail is justified by the absence of an output schema and the need to convey non-obvious pagination and null-handling behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by specifying the exact returned fields, the _meta behavior, error handling conventions, paging semantics, and data source. An agent has everything needed to select and invoke the tool correctly without consulting external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters, but the description adds operational meaning: all inputs are optional, the small row count makes unfiltered paging safe, state and lastName are exact matches, and offset pagination is tied to _meta.pagination.nextOffset. This adds actionable guidance beyond bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'Search' and names the exact resource: CMS's public 'Revoked Medicare Providers & Suppliers' list. It further distinguishes the tool from adjacent vetting sources by calling it 'a vetting lane in the same class as OFAC / SAM-exclusions lists' and clarifying it is CMS's public revocation register.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear use context: this is for CMS revocation vetting, is keyless, and is safe to page unfiltered because the full list is only ~7,059 rows. It also sets a boundary by stating it is 'NOT a current-eligibility, guilt, or fitness determination,' which helps agents avoid overinterpreting results, though it stops short of explicitly naming when to choose it over specific sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cms_search_datasetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Client-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'. | |
| limit | No | Datasets per page, 1..100, default 20 (client-side slice of the full catalog). | |
| offset | No | 0-based pagination offset (default 0), applied client-side against the known catalog length (never a server offset). |
TDQS
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.
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.
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.
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.
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.
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_billARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| billType | Yes | Bill type: hr/s/hjres/sjres/hconres/sconres/hres/sres. | |
| congress | Yes | Congress number, e.g. 117. | |
| billNumber | Yes | Bill number, e.g. 3076 (for H.R.3076). |
TDQS
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.
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.
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.
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.
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.
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_billsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Records per page, 1..250, default 20. | |
| query | No | Keyword — NOTE: Congress.gov /v3/bill has NO keyword search, so this is NOT applied (disclosed in _meta.filtersDropped). Use congress/billType/date filters instead. | |
| offset | No | 0-based record offset for pagination, default 0. | |
| billType | No | Bill type: hr/s/hjres/sjres/hconres/sconres/hres/sres. Requires `congress` (path /v3/bill/{congress}/{billType}). | |
| congress | No | Congress number, e.g. 118 (scopes the path to /v3/bill/{congress}). | |
| toDateTime | No | Filter to bills updated at/before this ISO-8601 date-time with offset, e.g. '2024-12-31T23:59:59Z'. | |
| fromDateTime | No | Filter to bills updated at/after this ISO-8601 date-time with offset, e.g. '2024-01-01T00:00:00Z'. |
TDQS
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.
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.
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.
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.
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.
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_opinionsARead-only
Search US federal court opinions via CourtListener (www.courtlistener.com/api/rest/v4/search, type=o). ★PROVENANCE: DATA is US federal court PUBLIC RECORDS; the API is CourtListener (Free Law Project, NON-PROFIT) — NOT a .gov API; the .gov primary source (PACER) is PAYWALLED. KEYLESS (optional free COURTLISTENER_API_TOKEN only raises the rate limit). Filters (all optional): query (full-text → q), court (^[a-z0-9]+$ — e.g. 'uscfc' US Court of Federal Claims, 'cafc' Federal Circuit, 'scotus'), dateFiledAfter/dateFiledBefore (ISO YYYY-MM-DD), natureOfSuit (folded into q — no verified dedicated filter, disclosed in notes), cursor (opaque continuation), order (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 (total match count) — NOT rows on this page. Pagination is OPAQUE CURSOR (pass _meta.nextCursor back as cursor; nextCursor:null/hasMore:false = last page). CourtListener v4 stops counting on deep cursor pages (count:null) → totalAvailable:null DISCLOSED, never faked as results.length. dateFiled is a date STRING; citation → flattened to string/string[]; judge/natureOfSuit/docketNumber null when absent; absoluteUrl is the full CL link. Genuine no-match → honest empty; 400 → invalid_input; 429 → rate_limited (Retry-After honored); 5xx/timeout THROWS; 200 non-JSON/count not number or null → schema_drift; off-host next REFUSED (SSRF). Token rides ONLY in the Authorization: Token header.
| Name | Required | Description | Default |
|---|---|---|---|
| court | No | A 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'. | |
| order | No | Sort order (maps to order_by), default 'dateFiled desc' (most recent first). E.g. 'dateFiled asc', 'score desc'. | |
| query | No | Full-text query (maps to q), e.g. 'bid protest' or a party name. Matches across the opinion text/metadata. | |
| cursor | No | Opaque continuation token for the NEXT page — pass back the _meta.nextCursor from the previous response (CourtListener uses CURSOR pagination, not page/offset). | |
| natureOfSuit | No | Nature-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). | |
| dateFiledAfter | No | Only opinions filed on/after this ISO date (→ filed_after), e.g. '2020-01-01'. Validated ^\d{4}-\d{2}-\d{2}$. | |
| dateFiledBefore | No | Only opinions filed on/before this ISO date (→ filed_before), e.g. '2024-12-31'. Validated ^\d{4}-\d{2}-\d{2}$. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Extremely rich behavioral disclosure well beyond annotations: opaque cursor pagination semantics (nextCursor:null/hasMore:false = last page), count stopping on deep pages with honest null disclosure, dateFiled as string, citation flattening, null handling for absent fields, error mapping (400→invalid_input, 429→rate_limited with Retry-After, 5xx throws, schema_drift on 200 non-JSON), and SSRF refusal for off-host 'next'. Annotations (readOnlyHint=true) are consistent and the description adds far more context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: purpose, provenance, filter list, return shape, and honesty guarantees. It is front-loaded with the purpose and provenance before technical details. The density of unique information justifies the length, though it could be trimmed slightly without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Exceptionally complete for a complex 7-param, cursor-paginated tool with no output schema. The description explicitly defines the return object shape ({ opinions:[...] } with all fields), the _meta structure, error semantics, and rate limiting. An agent has everything needed to call it correctly and interpret results without opening external docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema already documents all 7 parameters. The description adds value by explaining the mapping of natureOfSuit being folded into q (no verified dedicated filter), cursor as opaque continuation tied to _meta.nextCursor, and order defaulting to 'dateFiled desc' — meaning beyond bare schema descriptions. Minor deduction because some param detail repeats schema content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search US federal court opinions via CourtListener') with a URL, endpoint, and type. The provenance disclosure (Free Law Project, non-profit, NOT .gov, PACER paywalled) clearly differentiates it from any other search tool and from government API siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when this is appropriate: it covers US federal court opinions, discloses that the primary .gov source (PACER) is paywalled and that CourtListener is the keyless alternative. It explains token usage raises the rate limit. It doesn't name a specific sibling alternative for exclusion, but given no sibling does the same job, the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cpsc_recallsARead-only
Look up U.S. CPSC consumer-product RECALLS — recall title, hazard description, remedy, affected products, manufacturers, retailers, injuries, and country of manufacture (CPSC SaferProducts /RestWebServices/Recall; www.saferproducts.gov). KEYLESS. Siblings: nhtsa_recalls (vehicles), openfda_enforcement. Inputs (ALL optional): dateStart/dateEnd (YYYY-MM-DD recall date range), productName (substring), manufacturer (substring), recallNumber. 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 = 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. Empty result → HONEST EMPTY (returned:0), NOT an error; 4xx → invalid_input; 5xx/timeout → THROWS; 200 non-JSON or non-array → schema_drift. Nested arrays are flattened to name/description strings; NumberOfUnits kept as a string; every scalar is null-never-empty-string. Fixed host (SSRF-guarded); dates are ^\d{4}-\d{2}-\d{2}$ and recallNumber is letters/digits/hyphen only.
| Name | Required | Description | Default |
|---|---|---|---|
| dateEnd | No | Recall date range END (optional), YYYY-MM-DD, e.g. '2025-01-31' (→ RecallDateEnd). Validated ^\d{4}-\d{2}-\d{2}$. | |
| dateStart | No | Recall date range START (optional), YYYY-MM-DD, e.g. '2025-01-01' (→ RecallDateStart). Validated ^\d{4}-\d{2}-\d{2}$. | |
| productName | No | Product name substring filter (optional), e.g. 'helmet' (→ ProductName). | |
| manufacturer | No | Manufacturer name substring filter (optional) (→ Manufacturer). | |
| recallNumber | No | A specific CPSC recall number (optional), e.g. '25088' (→ RecallNumber). Letters/digits/hyphen only (^[A-Za-z0-9-]+$). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses an exceptional behavioral contract: the CPSC response is a bare array with no count field and no pagination, so totalAvailable always equals the number of returned recalls and complete:true is never fabricated; a default ~90-day window applies when no filter is given; empty results are honest empties not errors; 4xx maps to invalid_input, 5xx/timeout throws, and 200 non-JSON/non-array maps to schema_drift; normalization rules (flattened arrays, NumberOfUnits as string, null-never-empty-string) are specified. This fully arms an agent against misinterpreting the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense (~200 words) but every sentence carries information: purpose, auth stance, sibling routing, inputs, return shape, honesty contract, error mappings, and normalization. The ALL-CAPS markers (KEYLESS, HONESTY) break the wall of text into scannable segments. It loses one point because the HONESTY sentence is a long run-on packing several distinct behaviors into one clause chain, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the return shape including every recall field and the honest _meta object. It also covers the quirky API contract (no pagination, no count, default window, error taxonomy, input validation rules) that an agent could not infer otherwise. The read-only safety profile is handled by annotations. Nothing an agent needs to call this tool correctly or interpret its result is left unsaid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — every parameter already carries a description, example, and validation regex, so the schema does the heavy lifting. The description adds only marginal value: the 'ALL optional' note and a prose restatement of the date/substring filter semantics already present in the schema. Baseline 3 is appropriate under high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair, 'Look up U.S. CPSC consumer-product RECALLS', and enumerates the exact content covered (hazard description, remedy, affected products, manufacturers, retailers, injuries, country of manufacture). It also names the nearest confusable siblings (nhtsa_recalls for vehicles, openfda_enforcement) so an agent can distinguish this tool without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sibling list with parenthetical scopes ('nhtsa_recalls (vehicles)', 'openfda_enforcement') gives a clear routing signal: consumer-product recalls go here, vehicle recalls and FDA enforcement go to the named alternatives. It also states that all inputs are optional and discloses the default 90-day window when no filter is given. The exclusions are implied through sibling hints rather than explicit 'use X instead when...' prose, which keeps this just shy of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cve_lookupARead-only
Look up NIST NVD CVE records (keyless; services.nvd.nist.gov CVE API 2.0) — exact by cveId OR search by keyword/cpeName/cvssV3Severity/date range — each row JOINED with its CISA KEV status. 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, resultsPerPage (≤2000, def 50), startIndex. CVSS HONESTY: every ^cvssMetric key (V2/V30/V31/V40) is its own element — versions never conflated; V2 baseSeverity reads from metric level; primaryCvss is highest-version, type:Primary preferred but FALLS BACK to highest Secondary (real CNA score never dropped), null ONLY when no CVSS exists — base scores null-never-0. KEV HONESTY: kev is {listed:true,dateAdded,dueDate,ransomware,requiredAction,catalogVersion} | {listed:false,note} | {listed:null,status:'unavailable'}; not-listed ≠ safe (absence is NOT a clearance); if KEV catalog cannot load, kev.listed degrades to NULL (never false) with fieldsUnavailable:['kev']; a kevOnly filter during KEV outage THROWS. PAGINATION from NVD EXACT totalResults (never page length). Genuine totalResults:0 → honest found:false; 403/429 → rate_limited THROWS with NVD_API_KEY tier disclosure; 404/5xx/timeout/off-host THROW. Optional free NVD_API_KEY (env) lifts the rate — sent ONLY in the apiKey header.
| Name | Required | Description | Default |
|---|---|---|---|
| cveId | No | Exact 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. | |
| cpeName | No | A 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). | |
| kevOnly | No | When 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'). | |
| keyword | No | Free-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). | |
| pubEndDate | No | Publication-date window END (ISO YYYY-MM-DD). Paired with pubStartDate. | |
| startIndex | No | Zero-based page offset (default 0). Pagination derives from NVD's exact totalResults, never the page length. | |
| pubStartDate | No | Publication-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. | |
| cvssV3Severity | No | Filter to a CVSS v3 base severity band (LOW|MEDIUM|HIGH|CRITICAL). | |
| lastModEndDate | No | Last-modified window END (ISO YYYY-MM-DD). Paired with lastModStartDate. | |
| resultsPerPage | No | Rows per page (default 50, max 2000 — NVD's cap). Over-cap is refused, never silently clamped. | |
| lastModStartDate | No | Last-modified window START (ISO YYYY-MM-DD). PAIRED with lastModEndDate (both required together). A span >120 days is clamped + disclosed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=true and openWorldHint=true; the description carries a huge amount of behavioral disclosure: CVSS version-conflation rules, primaryCvss fallback behavior, KEV degradation to null, kevOnly throwing during KEV outage, NVD-exact pagination, honest found:false, rate-limit/403/429 throws, and API-key header behavior. This far exceeds what annotations provide and never contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is extremely dense and structured: purpose and modes first, then return shape, then explicit honesty guarantees, pagination, errors, and auth. Every sentence conveys a distinct operational fact; the length is justified by the tool's 11-parameter complexity and no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description is exceptionally complete: it specifies the full return object, error behavior, rate-limit handling, degraded KEV semantics, pagination source, and auth protocol. An agent has enough context to select the tool, construct valid parameters, and anticipate edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, which sets a baseline of 3, but the description adds substantial semantics beyond the schema: kevOnly's throw-on-outage behavior, resultsPerPage over-cap refusal rather than clamping, startIndex pagination from NVD exact totalResults, date-window pairing/clamping, keyword sanitization, and cveId validation. These are meaningful behavioral additions to all major parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Look up NIST NVD CVE records' via the NVD CVE API 2.0. It clearly narrows the scope to exact-by-cveId or search-by-keyword/cpeName/severity/date-range modes, and emphasizes the distinct CISA KEV join, which separates it from the sibling cisa_kev_lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: exact lookup versus keyword/CPE/severity/date-range search, plus optional kevOnly and pagination. It does not explicitly name alternative sibling tools or say when NOT to use this tool versus cisa_kev_lookup, so it falls just short of the 5-level explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
datagov_search_datasetsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Datasets per page (→ _size), 1..100, default 20. | |
| query | No | Free-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). | |
| cursor | No | Opaque 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. | |
| organization | No | Publisher organization SLUG filter (→ organization), e.g. 'epa-gov', 'noaa-gov'. An org catalog lists that agency's published datasets. |
TDQS
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.
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.
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.
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.
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.
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_datasetARead-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 — without the key this tool THROWS an honest config error (get one at https://dataportal.dol.gov/registration; dol_list_datasets stays 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; rides the PATH, ^[A-Za-z0-9_]+$), optional limit (def 10, max 100), offset, filterField+filterValue (paired equality filter), fields (best-effort column selection). Returns { records:[…verbatim dataset rows…] } + honest _meta. HONESTY: records are surfaced VERBATIM (field names/values preserved as-is — genuine 0 stays 0, missing field stays null; never coerced or fabricated). totalAvailable is a real count ONLY when the response carries one, else null (honest unknown — returned is NEVER passed off as the total). A full page → hasMore; page forward to confirm. Missing/invalid key (401/403) → invalid_input carrying DOL_API_KEY guidance (never empty); 400 → invalid_input; genuine empty → honest empty; 429 → rate_limited THROWS (Retry-After honored); 5xx/timeout → upstream_unavailable THROWS; 200 non-JSON / no row array → schema_drift. Key rides ONLY in the X-API-KEY request header — never URL/_meta.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max records to return (default 10, max 100). Offset-paginated. | |
| table | Yes | The 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. | |
| agency | Yes | The agency abbreviation (the `agencyAbbr` from dol_list_datasets), e.g. 'WHD', 'OSHA', 'ILAB'. Rides in the request PATH. Validated ^[A-Za-z0-9_]+$. Required. | |
| fields | No | Optional: 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). | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| filterField | No | Optional: a dataset field name to filter on (paired with filterValue → a DOL filter_object equality filter). Supply BOTH or NEITHER. | |
| filterValue | No | Optional: the value the filterField must equal. Supply BOTH filterField and filterValue, or NEITHER. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=true, so the description carries the behavioral burden — and it delivers richly: full error taxonomy (401/403→invalid_input with key guidance, 429→rate_limited THROWS honoring Retry-After, 5xx→upstream_unavailable, 200 non-JSON→schema_drift), the verbatim-data honesty policy (genuine 0 stays 0, missing stays null), and the guarantee that `returned` is never passed off as `totalAvailable`. It even specifies key transport (X-API-KEY header only, never URL/_meta).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is front-loaded (purpose first, then the critical auth requirement) and every sentence carries operational information — error mapping, pagination semantics, honesty guarantees — rather than filler. The repeated 'honest/honesty' emphasis is stylistically redundant across several sentences, which costs it the top score, but nothing here is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the return contract: { records: […] verbatim rows }, honest _meta with the totalAvailable-null-if-unknown rule, and hasMore semantics for paging forward. All failure modes, the auth requirement, and the keyless alternative are covered. Given the tool's complexity (7 params, external API, auth, multiple error classes), nothing an agent needs to call it correctly is left to guesswork.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents all 7 parameters, including the paired filterField/filterValue constraint and the regex validation. The description adds marginal value beyond this — mainly that parameters 'ride the PATH' and that inputs derive from dol_list_datasets fields — but most of its parameter text mirrors what the schema already states, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource pair — 'Fetch records from ONE US DOL dataset' — and pinpoints the endpoint shape (/v4/get/{agency}/{endpoint}/json). It also names the keyless sibling dol_list_datasets inside the description, so an agent can immediately tell this is the data-fetching tool as opposed to the dataset-discovery one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The key precondition is stated explicitly and without ambiguity: 'REQUIRES a free DOL_API_KEY... the DOL DATA endpoint has NO keyless tier,' with a registration URL and the note that 'dol_list_datasets stays keyless.' It also tells the agent exactly where its inputs come from (agencyAbbr and apiUrl from dol_list_datasets), giving clear when-to-use and dependency guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dol_list_datasetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Datasets to return per page (default 25, max 200). Offset-paginated over the (filtered) catalog. | |
| query | No | CLIENT-SIDE free-text filter (substring over dataset name / description / category / table / endpoint), e.g. 'child labor', 'wage', 'inspection'. | |
| agency | No | CLIENT-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. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. |
TDQS
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.
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.
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.
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.
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.
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_sectionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Optional eCFR issue date YYYY-MM-DD; omit to use the title's LATEST issue (disclosed in _meta). | |
| section | Yes | The 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})?$). | |
| titleNumber | Yes | CFR title (1–50). e.g. 2 = federal financial assistance (grants), 29 = Labor, 26 = IRS. For FAR/DFARS (title 48) prefer far_clause_lookup. |
TDQS
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.
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.
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.
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.
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.
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_titlesARead-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.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
ecfr_searchARead-only
Full-text search across the entire CFR (Code of Federal Regulations). Use for DISCOVERY — pass titleNumber=48 for FAR (Federal Acquisition Regulation), titleNumber=2 for federal financial assistance, etc. Returns a ranked EXCERPT (snippet, not full text) + section path + ecfrUrl per hit. To then read the COMPLETE text of a hit: for a FAR/DFARS clause (title 48) use far_clause_lookup (adds prescription + revision); for any other title's section use ecfr_get_section; or open the ecfrUrl.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| perPage | No | ||
| titleNumber | No | CFR title (1-50). e.g. 48 = FAR (Federal Acquisition Regulation), 2 = Federal financial assistance. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint. The description adds useful behavioral context: it returns a ranked EXCERPT (not full text), section path, and ecfrUrl. It does not contradict annotations and provides additional details about the output format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and each sentence adds value. No filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the return structure (excerpt, section path, ecfrUrl). It also links to sibling tools for next steps. However, it does not mention pagination or perPage behavior, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 33% (only titleNumber has a description). The description adds value by explaining titleNumber usage with examples (48 for FAR, 2 for financial assistance), but for query and perPage it provides no additional meaning beyond the schema's property definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Full-text search across the entire CFR' with specific examples (titleNumber=48 for FAR, titleNumber=2 for financial assistance). It distinguishes itself from sibling tools like far_clause_lookup and ecfr_get_section by emphasizing it returns excerpts for discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for DISCOVERY' and provides clear instructions for what to do after getting a hit: use far_clause_lookup for FAR/DFARS clauses, ecfr_get_section for other titles, or open the ecfrUrl. This gives excellent 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.
echo_facility_reportARead-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 (the RegistryID exactly as returned by echo_search_facilities rows — usually a 12-digit FRS id, but ECHO also returns state/program ids like 'DCR000509282' and short ids like '9434', all accepted; 1–20 letters/digits). 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).
| Name | Required | Description | Default |
|---|---|---|---|
| registryId | Yes | The facility's RegistryID exactly as returned in echo_search_facilities rows — usually a 12-digit FRS id (e.g. '110059768461'), but ECHO also returns state/program ids (e.g. 'DCR000509282') and short ids (e.g. '9434'), which the report accepts. 1–20 letters/digits. A bad/unknown id ⇒ not_found (never a fabricated report). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnlyHint=true and openWorldHint=true, and the description adds meaningful behavioral detail: keyless access, accepted ID formats, exact return shape (registryId + report + _meta with complete:true and no pagination), and a clear not_found error guarantee with no fabricated reports. This goes well beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: purpose, input requirement, return shape, and error behavior are covered in four purposeful sentences. Every sentence earns its place, and the most decision-relevant details (single facility, RegistryID, not_found guarantee) are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description specifies the return envelope, the verbatim report content, metadata behavior, pagination absence, and error semantics. For a single-parameter tool with full schema coverage enough context is provided for an agent to invoke it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The parameter semantics are fully captured in the schema, and the description repeats the same format constraints and error behavior without adding materially new information about the parameter beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and resource ('EPA ECHO Detailed Facility Report') for exactly one facility by RegistryID. It clearly frames the report as a compliance/enforcement/inspection/permit deep-dive, distinguishing it from the sibling echo_search_facilities which is for discovery rather than report retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the tool is for one facility and explicitly ties the input to values 'exactly as returned by echo_search_facilities rows', which implies search-then-report workflow. It does not name an alternative explicitly, but the sibling relationship and one-facility scope provide adequate usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
echo_search_facilitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sic | No | Industry 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). | |
| limit | No | Facilities per page (→ responseset), 1..1000, default 100. | |
| naics | No | BEST-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. | |
| state | Yes | US 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'. | |
| offset | No | 0-based offset for pagination, default 0. MUST be an exact multiple of `limit` (ECHO pages on fixed boundaries; a non-multiple ⇒ invalid_input). | |
| majorOnly | No | true ⇒ only EPA 'major' facilities (p_maj=Y). | |
| federalOnly | No | true ⇒ only federal facilities (p_ff=Y). | |
| facilityName | No | Facility-name substring filter (p_fn). NOTE: not validated by ECHO — a typo silently returns 0 results, not an error. |
TDQS
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.
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.
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.
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.
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.
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_conceptARead-only
One filer × one XBRL concept × complete reported time-series (keyless; data.sec.gov companyconcept), including amendment/restatement history. Sits between edgar_company_facts (many concepts, one filer) and edgar_xbrl_frames (one concept, all filers). start=null for INSTANT concepts. Input: cikOrTicker, concept (EXACT alnum XBRL tag, e.g. 'Assets'), optional taxonomy (us-gaap|dei|ifrs-full, def us-gaap), unit (CLIENT-SIDE 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 — the SAME end with a DIFFERENT start is a different-duration fact (3-month vs 12-month), NOT a revision; a revision is multiple rows sharing the same (start,end) with differing accn/filed/val. DEFAULT returns ALL rows including restatement history + per-row canonical; canonicalOnly:true dedupes to one canonical row per (unit,start,end), fully disclosed, never a silent drop. Every row is unit-tagged; unitsAvailable discloses ALL units even under a unit filter; val is null-never-0. A bad CIK/taxonomy/concept → 404 → found:false (NEVER fabricated val:0); 5xx/timeout/non-JSON/shape-drift THROWS; unit not present → honest empty + available-units note (unit is CLIENT-SIDE, not a path segment). cik/taxonomy/concept are validated path segments (no injection). NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS — no authoritative CIK↔UEI join.
| Name | Required | Description | Default |
|---|---|---|---|
| fy | No | Optional CLIENT-SIDE filter: keep only rows whose fiscal year `fy` equals this integer (e.g. 2023). | |
| form | No | Optional CLIENT-SIDE filter: case-insensitive EXACT match on a row's `form` (e.g. '10-K' for annual values only, '10-Q' for quarterly). | |
| unit | No | Optional 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). | |
| limit | No | CLIENT-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. | |
| offset | No | 0-based client-side offset into the filtered time-series (default 0). | |
| concept | Yes | XBRL 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). | |
| taxonomy | No | XBRL 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. | |
| cikOrTicker | Yes | A 10-digit (or unpadded) SEC CIK, or a ticker/company-name resolvable via company_tickers.json (e.g. '320193', 'CIK0000320193', 'AAPL'). | |
| canonicalOnly | No | When 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description carries a heavy load and exceeds it. It discloses the (start,end)-pair period identity rule, the canonicalOnly dedupe that is 'fully disclosed, never a silent drop', 'val is null-never-0', 'NEVER fabricated val:0' on 404, throw-on-shape-drift, and the CIK-not-SAM-UEI caveat. This is model-grade transparency about failure modes and data semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but justified for a 9-parameter tool with no output schema; the return shape is compactly inlined and the honesty notes are organized under a labeled 'HONESTY M1' marker. It front-loads purpose and differentiators before details. Slightly over-stuffed — the error-semantics section could be trimmed — but every sentence earns its place given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Remarkably complete for a tool with no output schema: it inlines the full return object shape, enumerates error classes (404 vs 5xx vs non-JSON/shape-drift vs missing unit), documents pagination semantics (limit/offset are client-side over a fully-fetched series; SEC does not paginate), and warns about the CIK↔UEI gap. Nothing an agent needs to call it correctly or interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description genuinely adds meaning: it flags which parameters are CLIENT-SIDE versus path segments (unit, form, fy, limit/offset), explains canonicalOnly's dedupe key (unit,start,end), and links unit semantics to the disclosed-units behavior. The description reinforces and extends the schema rather than merely repeating it — though the schema itself is already unusually rich, so the marginal gain is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a crisp triple: 'One filer × one XBRL concept × complete reported time-series' — a specific verb-less but precisely scoped resource statement. It then names both sibling tools and the exact axis that differentiates them ('Sits between edgar_company_facts (many concepts, one filer) and edgar_xbrl_frames (one concept, all filers)'). An agent can disambiguate immediately without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions the tool relative to its two nearest siblings and enumerates the input contract (cikOrTicker, concept, optional taxonomy/unit/canonicalOnly/limit/offset). It also states when NOT to expect success — bad CIK/taxonomy/concept yields 404→found:false, unit-not-present yields honest empty — which tells the agent how to interpret outcomes and when to route elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgar_company_factsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| unit | No | XBRL 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. | |
| latest | No | true ⇒ reduce each concept to its single most-recent data point (by period end). false (default) ⇒ the full reported time series. | |
| concepts | No | Optional 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). | |
| cikOrTicker | Yes | A 10-digit (or unpadded) SEC CIK, or a ticker/company-name resolvable via company_tickers.json (e.g. '320193', 'AAPL'). |
TDQS
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.
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.
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.
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.
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.
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_filingsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| forms | No | Optional form-type filter (e.g. ['10-K','10-Q','8-K']); case-insensitive exact match on the filing's form. Omit for all forms. | |
| limit | No | Max filings to return, 1..100, default 20 (offset pagination over the recent window). | |
| offset | No | 0-based offset into the (form-filtered) recent filings, default 0. | |
| maxShards | No | Fan-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. | |
| cikOrTicker | Yes | A 10-digit (or unpadded) SEC CIK, or a ticker/company-name resolvable via company_tickers.json (e.g. '320193', 'CIK0000320193', 'AAPL'). | |
| fullHistory | No | When 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
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.
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.
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.
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.
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.
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_indexARead-only
Per-day sibling of edgar_filing_index. Per-day cross-filer SEC filing index (keyless; www.sec.gov EDGAR daily-index master.YYYYMMDD.idx) — reads ONE calendar day's index (~8K rows), full-scans it, and returns offset-paginated filings matching CLIENT-SIDE filters with the EXACT total. Answers the monitoring/alerting question ('every 8-K filed on 2024-01-03'). Input: date (required ISO YYYY-MM-DD, ≥1994-01-01, not future); optional formType (exact), cik (numeric), companyContains (LITERAL case-insensitive), limit (≤1000, def 100), offset. Returns { found, date, year, quarter, indexFile, returned, totalAvailable, filings:[{ cik, cikPadded, companyName, formType, dateFiled, filename, filingUrl }] }. HONESTY: totalAvailable is EXACT match count — never a page length. The daily-index pervasive-403 model is disambiguated via the quarter's index.json existence oracle, RECENCY-AWARE: a day NEWER than the newest published index → found:false, complete:FALSE, retryable not-yet-disseminated note (NEVER a confident empty); an unlisted day INSIDE the covered range (real weekend/holiday) → found:false, complete:true; a LISTED day whose .idx 403s → honest rate_limited; oracle inconclusive → ambiguous upstream_unavailable. A non-real/future date → invalid_input pre-fetch; non-index/all-malformed body → schema_drift. dateFiled normalized from compact YYYYMMDD to ISO. NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS — no authoritative CIK↔UEI join.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | Optional 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). | |
| date | Yes | Required 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). | |
| limit | No | Page 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). | |
| offset | No | 0-based offset into the filtered matches (default 0). | |
| formType | No | Optional 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. | |
| companyContains | No | Optional 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint/openWorldHint annotations already covering the safety profile, the description adds extraordinary behavioral context: full-scan-then-filter semantics, EXACT totalAvailable honesty guarantee, the recency-aware 403 disambiguation model (not-yet-disseminated vs. real weekend/holiday vs. rate_limited vs. ambiguous), the invalid_input/schema_drift error taxonomy, and the CIK-not-UEI keying caveat. An agent can predict edge-case outcomes before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries substantial content and the structure is sensible: purpose → inputs → output shape → honesty guarantee → error model → cross-domain note. It is long, but the length is earned by the genuinely complex 403/oracle behavior. It loses a point for the parameter summary block, which duplicates already-100%-covered schema descriptions without adding value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool of this complexity with no output schema, the description is remarkably complete: it specifies the full return shape, all three error classes (invalid_input, schema_drift, and the rate-limited/unavailable variants), pagination behavior, date normalization, and a cross-domain caveat. The 100%-detailed input schema handles parameters, and the description handles everything an agent needs to interpret results safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter is already richly documented (EXACT case-insensitive formType matching, padCik leading-zero safety, LITERAL contiguous companyContains, limit windowing semantics). The description's parameter summary ('formType (exact)...') largely restates what the schema already says, adding no new meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens by naming itself 'Per-day sibling of edgar_filing_index' and states exactly what it does: reads ONE calendar day's SEC daily index and returns offset-paginated filings matching client-side filters. The concrete example ('every 8-K filed on 2024-01-03') makes the resource and verb unmistakable, and the sibling differentiation is built into the first phrase.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Per-day sibling of edgar_filing_index' positioning names the alternative and the scoping axis (one day vs. presumably multi-day), and the monitoring/alerting question gives a concrete when-to-use scenario. However, it never explicitly states the inverse rule — 'for date ranges, use edgar_filing_index' — leaving some routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgar_filing_indexARead-only
Bulk sweep — per-filer edgar tools need a CIK. Bulk cross-filer SEC filing index for a quarter (keyless; www.sec.gov EDGAR full-index master.idx). Reads the WHOLE quarter's index (~370K rows: every filer's every filing — CIK|Company|Form|Date|Filename), 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, 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 }] }. 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 error (quarter-not-published OR the 10 req/s rate-block) — never a bare rate-limit and never a fake-empty. A non-index or all-malformed body → schema_drift. A future year / bad quarter → invalid_input pre-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 — no authoritative CIK↔UEI join.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | No | Optional 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). | |
| year | Yes | Filing 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. | |
| limit | No | Page 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). | |
| dateTo | No | Optional CLIENT-SIDE filter: keep filings whose Date Filed <= this ISO YYYY-MM-DD. | |
| offset | No | 0-based offset into the filtered matches (default 0). | |
| quarter | Yes | Calendar 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. | |
| dateFrom | No | Optional CLIENT-SIDE filter: keep filings whose Date Filed >= this ISO YYYY-MM-DD (string compare; the column is already YYYY-MM-DD). | |
| formType | No | Optional 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. | |
| companyContains | No | Optional 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the burden of behavioral disclosure. It goes far beyond that by revealing the full-quarter scan, exact match totals, truncation honesty, HTTP 403 ambiguity, schema_drift handling, future-quarter empty results, and current-quarter daily growth. No annotation contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is densely informative and well organized, front-loading the core purpose before covering filters, return shape, and edge cases. Every major claim addresses a concrete agent decision point. Minor redundancy with the schema descriptions keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explicitly defines the return object shape including year, quarter, indexFile, returned, totalAvailable, and filings with all subfields. It also covers input validation, error ambiguity, pagination semantics, and growth behavior, making the tool fully actionable for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description meaningfully supplements it: filters are explicitly 'CLIENT-SIDE', formType is exact and amendment-aware, companyContains is a literal contiguous substring, and limit does not reduce download size. It also explains leading-zero-safe CIK matching and exact-total semantics, adding real value beyond the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair: a bulk cross-filer SEC filing index for a quarter, sourced from EDGAR's keyless full-index master.idx. It distinguishes itself from per-filer EDGAR tools that require a CIK, and from siblings like edgar_daily_filing_index by emphasizing the whole-quarter bulk sweep. The resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening line signals when to choose this tool: per-filer EDGAR tools need a CIK, while this is a keyless bulk cross-filer sweep. It also explains the filtering model and error semantics, giving an agent a clear sense of appropriate use. It stops short of explicitly naming competing bulk-index alternatives, but the intended context is well communicated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgar_full_text_searchARead-only
Full-text search across EDGAR filings, 2001-present (keyless, efts.sec.gov). Input q (phrase in double-quotes for exact), optional forms, startdt/enddt (ISO), ciks (pin filings BY entities — numeric 10-digit SEC CIKs, zero-padded, exact-entity match), entityName (FUZZY filer-name narrowing — can match related filers, e.g. multiple 'Apple*'), from (offset; page size FIXED at 100 — no size param). Returns { accession, form, filingDate, entityNames, ciks, filingIndexUrl }. HONESTY: totalAvailable = the true match count, or a LOWER BOUND (totalIsLowerBound:true) when SEC reports ≥10000; a 0-result set with ciks/entityName applied is NOT proof of absence (verify the CIK via edgar_lookup_cik by name/ticker); from > 9900 is rejected (10000-result window). NOTE: EDGAR keys on CIK, NOT SAM UEI/DUNS.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Full-text query over EDGAR filings (2001-present). Wrap a phrase in double quotes for an exact match (e.g. '"climate risk"'). | |
| ciks | No | Optional: pin filings BY one or more entities, by NUMERIC SEC CIK (each is zero-padded to 10 digits — an EXACT-entity match). Multiple CIKs are AND-of-OR (any of the listed entities). A ticker/company name / CIK-0 entry is rejected as invalid_input — use `entityName` or resolve the CIK first with edgar_lookup_cik. | |
| from | No | 0-based result offset for pagination; page size is FIXED at 100 (there is no size param). Must be <= 9900 (from+100 ≤ 10000 upstream window); a larger from is rejected as invalid_input. | |
| enddt | No | Optional ISO YYYY-MM-DD filing-date upper bound (sets dateRange=custom). | |
| forms | No | Optional form-type filter (e.g. ['10-K','8-K']). | |
| startdt | No | Optional ISO YYYY-MM-DD filing-date lower bound (sets dateRange=custom). | |
| entityName | No | Optional FUZZY filer-name narrowing (matches the filer's display name; NOT CIK-exact — can match related entities, e.g. multiple 'Apple*' filers). Combine with `ciks` for an exact-entity result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. Description goes beyond: reveals totalAvailable may be lower bound, 10000-result window, from rejection, and that 0 results with ciks/entityName require verification. Provides HONESTY note about SEC reporting limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: front-loads core purpose, then lists parameters in order with clear syntax notes, followed by key behavioral notes. Every sentence adds value; no fluff. Efficiently packs parameter semantics and warnings without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 7-parameter tool without output schema, the description is complete. It covers all parameters, pagination, result fields, behavioral quirks, and cross-references another tool (edgar_lookup_cik). Even notes key difference (CIK not SAM UEI/DUNS). Leaves no gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds significant value: explains q exact-match syntax, ciks format and validation, from pagination limits, entityName fuzzy matching, and suggests combining ciks with entityName. Each parameter is enriched with non-obvious usage details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Full-text search across EDGAR filings, 2001-present' with specific verb and resource. While the purpose is obvious, it does not explicitly differentiate from sibling tools like edgar_company_filings or edgar_filing_index, leaving the agent to infer when to use this vs others.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Excellent guidance: explains when to use (full-text search with optional filters), how to use parameters (ciks vs entityName, from limits), and caveats (0 results not proof of absence, verify CIK via edgar_lookup_cik). Explicitly states page size is fixed at 100 and from > 9900 rejected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgar_lookup_cikARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company 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
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.
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.
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.
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.
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.
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_framesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | XBRL concept tag — EXACT, alphanumeric only (e.g. 'Assets', 'Revenues', 'NetIncomeLoss', 'EarningsPerShareBasic'). A non-matching tag ⇒ upstream 404 ⇒ found:false (never a fabricated 0). | |
| unit | No | XBRL 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. | |
| limit | No | CLIENT-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). | |
| offset | No | 0-based client-side offset into the fetched cross-section (default 0). Page via _meta.pagination.nextOffset to reach every filer. | |
| period | Yes | Calendar 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. | |
| taxonomy | No | XBRL 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. | |
| includeStats | No | When 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
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.
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.
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.
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.
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.
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_facilitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max facilities to return (1–100, default 25). Offset-paginated. | |
| state | No | A 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). | |
| county | No | A partial county-name match (→ county_name/CONTAINING/…), e.g. 'FAIRFAX'. Optional additional filter; same charclass as facilityName. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| facilityName | No | A 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
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.
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.
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.
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.
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.
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_findingsARead-only
Drill into audit-RISK findings for an entity from the Federal Audit Clearinghouse (keyless via 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) or reportId is REQUIRED (empty query refused); optional auditYear, 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: is* flags surfaced VERBATIM ("Y"/"N") PLUS typed riskFlags tri-state ("Y"→true / "N"→false / blank/absent → null=UNKNOWN) — null NEVER rendered as false (the false-CLEAR class). ★EMPTY ≠ CLEAN: empty findings does NOT confirm a clean audit — the entity may not have filed a Single Audit (below the $750K threshold), may predate FAC coverage, or UEI wrong; a disclosure note fires on any empty result; on empty, confirm an ACCEPTED audit via fac_search_audits. ★PII: HARDCODED select-allowlist, entity + audit-risk fields only. totalAvailable is EXACT Content-Range total ('*'/absent → null + hedge, never 0); 400/403/5xx/timeout/HTML/non-array THROW. NOT a debarment/determination — cross-check SAM + OFAC. DEMO_KEY ~10 req/hr — set DATA_GOV_API_KEY.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page, 1..100, default 50. | |
| offset | No | 0-based row offset for pagination (default 0). | |
| reportId | No | Filter by FAC report_id (^[0-9A-Za-z-]+$; → report_id=eq. — from a fac_search_audits row). | |
| auditYear | No | Filter by audit year (int, → audit_year=eq.). | |
| auditeeUei | No | Filter by 12-char SAM UEI (^[A-Z0-9]{12}$; → auditee_uei=eq.). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds substantial behavioral disclosure: the verbatim 'Y'/'N' flags vs. tri-state riskFlags with null-as-unknown, the explicit 'empty ≠ clean' warning, exact Content-Range total semantics, error handling (throws on 400/403/5xx/timeout/HTML/non-array), PII allowlisting, and rate-limit caveats. This is far more than annotations alone and directly prevents misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place—it packs purpose, parameter constraints, return shape, honesty caveats, error behavior, and rate-limit notes into a dense but organized block. The most critical information (purpose and required parameters) is front-loaded, and the rest follows logically. It's verbose but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description fully specifies the return object (findings array with field names and riskFlags object), the semantics of empty results, error conditions, and rate limits. For a complex tool with nuanced data interpretation, this is exceptionally complete. An agent has everything needed to call it correctly and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all five parameters with descriptions at 100% coverage, so the schema already documents limit, offset, reportId, auditYear, and auditeeUei. The description adds a little extra context (e.g., 'from a fac_search_audits row' for reportId, and the requirement that at least one of auditeeUei or reportId must be set), but this is marginal 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Drill into audit-RISK findings') on a specific resource (Federal Audit Clearinghouse findings) and positions it as the risk-detail step after fac_search_audits, clearly distinguishing it from the sibling search tool. This is a precise, non-tautological purpose that an agent can act on immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly notes this is the step after fac_search_audits and requires at least one of auditeeUei or reportId. It also advises against using it for debarment/determination and says to cross-check SAM and OFAC. While it doesn't name a direct alternative beyond fac_search_audits, the context and exclusion (not a debarment tool) give solid guidance on when and 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.
fac_search_auditsARead-only
Search entity Single Audit summaries from the Federal Audit Clearinghouse (keyless via 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). Filters (all optional, AND-combined): auditeeUei (12-char SAM UEI — PRIMARY join key to SAM/USAspending/EDGAR), auditeeState (2-letter), auditYear (int), totalExpendedMin/totalExpendedMax (USD). 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 report_id (or UEI) to fac_get_findings for the audit-RISK flags. ★PII: a HARDCODED select-allowlist surfaces ONLY entity + audit-summary fields and DELIBERATELY EXCLUDES personal-contact columns — NO caller select/column param. HONESTY: totalAvailable is the EXACT Content-Range total (a response header under Prefer:count=exact; '*'/absent/non-numeric denominator → totalAvailable:null + page-fullness hedge, NEVER 0); total_amount_expended is null-never-0; a bad column → PostgREST 400 → invalid_input (filtersDropped ALWAYS empty); genuine [] → honest empty; 400/403/5xx/timeout/HTML/non-array THROW. NOT a debarment/exclusion/fitness determination — cross-check SAM + OFAC. Keyless-first via DEMO_KEY (~10 req/hr shared; set DATA_GOV_API_KEY for production — never logged).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page, 1..100, default 25. | |
| offset | No | 0-based row offset for pagination (default 0). | |
| auditYear | No | Filter by audit year (int, → audit_year=eq.). e.g. 2024. | |
| auditeeUei | No | Filter by 12-char SAM UEI (^[A-Z0-9]{12}$; → auditee_uei=eq. — the PRIMARY join key to SAM/USAspending/EDGAR). e.g. 'ZQGGHJH74DW7'. | |
| auditeeState | No | Filter by 2-letter US state code (uppercase; → auditee_state=eq.). e.g. 'CA'. | |
| totalExpendedMax | No | Maximum total federal awards expended (USD, → total_amount_expended=lte.). | |
| totalExpendedMin | No | Minimum total federal awards expended (USD, → total_amount_expended=gte.). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses extensive behavioral traits: hardcoded select-allowlist excluding PII, honest totalAvailable semantics (exact Content-Range, null handling), null-never-0 for total_amount_expended, precise error handling (PostgREST 400 → invalid_input, filtersDropped always empty, genuine [] → honest empty, throws on various failures), keyless usage via DEMO_KEY with rate limits, and production key guidance. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and lengthy, but every sentence carries value: purpose, context, filters, return shape, honesty guarantees, error behavior, and authentication notes. It is front-loaded with purpose and context, then details follow logically. While not succinct, it is well-structured and justified for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 7 parameters and no output schema, the description compensates by specifying the exact return JSON structure (audits array with fields) and the _meta object. It also explains error semantics, pagination (limit/offset), the primary join key, and cross-reference guidance. Nothing essential is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for each parameter. The description adds meaningful context: filters are AND-combined, limit capped at 100 (def 25), offset explained, and auditeeUei identified as the PRIMARY join key to SAM/USAspending/EDGAR. This goes beyond the schema but does not introduce new syntax, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches entity Single Audit summaries from the Federal Audit Clearinghouse, with a specific context (subcontractor/teaming audit-risk vetting) and explicit filters. It distinguishes itself from sibling fac_get_findings by directing the user to feed report_id or UEI to that tool for audit-RISK flags, ensuring no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states this is the entry point for audit-risk vetting, explains when to use it (searching entity audit summaries), and provides exclusions: 'NOT a debarment/exclusion/fitness determination — cross-check SAM + OFAC.' It also directs the user to fac_get_findings for follow-up, leaving no doubt about alternative tools or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
far_clause_lookupARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| asOfDate | No | Point-in-time codification date (YYYY-MM-DD). Defaults to Title 48's current up_to_date_as_of. | |
| clauseNumber | Yes | FAR or DFARS clause/provision number, e.g. '52.212-4', '252.204-7012', '52.204-25'. An optional 'FAR '/'DFARS ' prefix is stripped. | |
| includePrescription | No | Also fetch the prescribing section parsed from the clause's 'As prescribed in …' opener (the rule for WHEN the clause applies). Default true. |
TDQS
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.
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.
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.
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.
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.
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_matrixARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| clauses | Yes | The 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']. | |
| asOfDate | No | Point-in-time codification date (YYYY-MM-DD) — typically the solicitation issue date. Defaults to Title 48's current up_to_date_as_of. | |
| flagGates | No | Tag 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. | |
| includePrescription | No | Also fetch each clause's prescribing section (the 'As prescribed in …' rule for WHEN it applies). Default true. |
TDQS
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.
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.
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.
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.
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.
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.
far_searchARead-only
FAR/DFARS-scoped semantic search — the 'which clauses touch topic X' front-door that feeds far_clause_lookup. COMPOSES ecfr_search but fixes its two compliance flaws: (1) it filters to FAR (Title 48 chapter 1) or DFARS (chapter 2), EXCLUDING GSAM/agency supplements (so 'limitations on subcontracting' no longer mis-ranks GSAM 552.x over FAR 52.x), and (2) it collapses eCFR's ~5-versions-per-section HISTORICAL duplicates to the CURRENT in-force version (endsOn==null). scope: far (default) | dfars | both. dedupeVersions (default true; false shows all historical rows). partsOnly restricts to given parts (e.g. [52] clause text). Returns distinct sections with regulation/section/headingPath/excerpt/score/ecfrUrl/effectiveOn/endsOn/isCurrent, distinctSections, and the farOverhaulRisk caveat. TRUTHFUL: dedupe never drops a distinct section (the raw→distinct collapse is disclosed); a kept-historical row is marked isCurrent:false; a search-endpoint outage THROWS (never a fake 0 results); totalAvailable is null (a deduped view has no clean upstream count). Keyless.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to search FAR/DFARS text for, e.g. 'limitations on subcontracting', 'covered defense information', 'commercial item'. | |
| scope | No | Which corpus to search: 'far' (Title 48 chapter 1, the default), 'dfars' (chapter 2), or 'both'. Excludes GSAM/agency supplements. | |
| perPage | No | Number of DISTINCT sections to return (1–20). Default 5. | |
| partsOnly | No | Restrict results to these FAR/DFARS parts, e.g. [52] for clause text only, [12] for commercial-item policy. | |
| dedupeVersions | No | Collapse each section's historical versions to the current (in-force) one. Default true. false ⇒ return all raw rows incl. historical. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behaviors beyond annotations: deduplication logic, truthful error handling (throws on outage, no fake zero results), marking of non-current versions, and the farOverhaulRisk caveat. No contradiction with readOnlyHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but front-loaded with the core purpose; every sentence adds value. Slightly verbose due to comprehensive disclosure, but no unnecessary content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description thoroughly explains return fields (list, distinctSections, effectiveOn, isCurrent, etc.) and behavioral traits. Given tool complexity (5 params) and lack of output schema, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the description adds substantial meaning: explains that scope excludes GSAM/agency supplements, dedupeVersions collapses historical versions, partsOnly restricts to specific parts, and query is a semantic search. This enriches the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs semantic search over FAR/DFARS regulations, explicitly distinguishes itself from sibling tools like ecfr_search by highlighting compliance fixes, and positions itself as the front-door to far_clause_lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool (topic-based search) and contrasts with ecfr_search and far_clause_lookup, including details on scope options (far, dfars, both) and deduplication behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_bank_failuresARead-only
Historical FDIC-insured bank failures & assistance transactions (keyless; api.fdic.gov/banks/failures). CERT links a failure back to fdic_search_institutions / fdic_institution_financials. Filters: state (2-letter → PSTALP — NOTE: /failures state field is PSTALP, NOT STALP), failYear (→FAILYR), cert (→CERT, the STABLE entity key). limit (≤1000), offset (≤100000), sortBy (FAILDATE/COST/QBFASSET/QBFDEP/NAME/FAILYR, def FAILDATE), sortOrder (def DESC). Returns { failures:[{ name, cert, failDate, failYear, city, state, resolutionType, resolutionFund, estimatedLossUSD, depositsUSD, assetsUSD, id }] }. NO name/city filter — FDIC /failures search param is IGNORED (returns the whole dataset); to find a specific bank's failure, resolve its CERT via fdic_search_institutions. HONESTY: totalAvailable is EXACT meta.total (stable across offset). failDate normalized from FDIC's M/D/YYYY to ISO YYYY-MM-DD (unrecognized → surfaced raw + disclosed, never nulled). COST/QBFDEP/QBFASSET are $thousands normalized to whole USD ×1000 (null-never-0 — genuine 0 = a no-loss assisted transaction stays 0; NEGATIVE COST = a net DIF recovery/gain, not a loss; absent → null). ONLY honest empty is meta.total:0/data:[] → complete:true/total:0; any other envelope (400 errors[]/404/non-JSON/missing meta or data) THROWS (never fake-empty). The point-in-time snapshot build time is disclosed. NOTE: FDIC keys on CERT, not SAM UEI/DUNS.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | No | Filter by FDIC certificate number (the STABLE entity key; → CERT filter). Resolve a bank's CERT via fdic_search_institutions. | |
| limit | No | Rows per page, 1..1000, default 100. | |
| state | No | Filter by 2-letter US state code (uppercase; → PSTALP filter — the /failures state field is PSTALP, NOT STALP). e.g. 'CA'. | |
| offset | No | 0-based row offset for pagination, 0..100000, default 0. | |
| sortBy | No | Sort field (allowlisted enum; default FAILDATE = failure date). An unknown field is rejected before fetch. | |
| failYear | No | Filter 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). | |
| sortOrder | No | Sort direction, default DESC (most-recent failures first). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations declare readOnlyHint=true and openWorldHint=true, the description goes far beyond this: it discloses exact error behavior (honest empty vs throwing), date normalization, cost-unit conversion from thousands to whole USD, null handling, negative-COST semantics, and the fact that totalAvailable is exact. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but exceptionally dense and front-loaded with the resource and key relationships before filters, return shape, and edge cases. Every sentence carries operational information an agent needs: field mappings, sorting defaults, normalization rules, and failure behavior. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description provides the full return shape, all parameter semantics, pagination notes, filtering limitations, error behavior, and data normalization details. Given the API's complexity and the absence of an output schema, the description is complete enough for an agent to invoke the tool correctly without additional external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds substantial meaning beyond the schema: it maps each filter to the underlying FDIC field (state→PSTALP, failYear→FAILYR, cert→CERT), explains boundaries, defaults, enum behavior, and gives concrete examples. This materially reduces the chance of misusing parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as returning historical FDIC-insured bank failures and assistance transactions, names the underlying endpoint, and explicitly links CERT to related tools (fdic_search_institutions, fdic_institution_financials). This differentiates it from sibling tools by dataset and primary entity key, and the return shape confirms what the agent will receive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: it states there is NO name/city filter, that the FDIC search param is ignored, and that to find a specific bank's failure the agent should resolve its CERT via fdic_search_institutions. It also clarifies the stable entity key relationship, effectively routing the agent to the correct sibling tool when needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_branch_depositsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | No | Filter by FDIC certificate number (the STABLE entity key; → CERT filter). Resolve a bank's CERT via fdic_search_institutions. | |
| year | No | Filter by Summary-of-Deposits survey YEAR (→ YEAR filter), the annual June-30 snapshot year. 1934..current UTC year. | |
| limit | No | Rows per page, 1..1000, default 100. | |
| state | No | Filter 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. | |
| offset | No | 0-based row offset for pagination, 0..100000, default 0. | |
| sortBy | No | Sort field (allowlisted enum; default YEAR = snapshot year). An unknown field is rejected before fetch. | |
| sortOrder | No | Sort direction, default DESC (newest snapshot / largest deposits first). |
TDQS
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.
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.
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.
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.
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.
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_summaryARead-only
FDIC banking-sector ANNUAL AGGREGATES — total assets, deposits, net income, equity & net interest income + institution/office/branch/employee counts for the whole US OR one state, split by charter class (keyless; api.fdic.gov/banks/summary). Filters (all optional): year (→YEAR), state (→STALP — NOTE: /summary uses STALP, NOT PSTALP; accepts TX/CA/DC/GU/PR or ROLL-UP codes USA/US/OT/PI), charterClass (CB=commercial, SI=savings; omit for both). limit (≤1000), offset (≤100000), sortBy (YEAR/ASSET/DEP/NETINC/BANKS), sortOrder. Returns { summary:[{ year, charterClass, charterClassCode, geography, stateCode, stateFips, scope, isRollup, institutionCount, officeCount, branchCount, employeeCount, totalAssetsUSD, totalDepositsUSD, netIncomeUSD, totalEquityUSD, netInterestIncomeUSD, id }] }. ★ROLL-UP HONESTY: STALP ∈ {USA,US,OT,PI} are GEOGRAPHIC AGGREGATES (isRollup:true). NEVER sum a roll-up row with jurisdiction rows or across scopes — USA is the one national figure; a roll-up is NOT a state. ★netInterestIncomeUSD is net interest INCOME ($ sum), NOT the margin ratio; NO ratio fields (ROA/ROE); derive from netIncomeUSD/totalAssetsUSD/totalEquityUSD. NO name/city filter — FDIC /summary search is ignored; drill via fdic_search_institutions. HONESTY: totalAvailable is EXACT meta.total; money ($thousands → whole USD ×1000, null-never-0; genuine 0 stays 0; absent → null); counts pass through unscaled; non-int year rejected pre-fetch; ONLY honest empty is meta.total:0/data:[] → complete:true/total:0; any other envelope THROWS. NOTE: FDIC keys on CERT, not SAM UEI/DUNS.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Filter 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). | |
| limit | No | Rows per page, 1..1000, default 100. | |
| state | No | Filter 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. | |
| offset | No | 0-based row offset for pagination, 0..100000, default 0. | |
| sortBy | No | Sort field (allowlisted enum; default YEAR = aggregate year). An unknown field is rejected before fetch. | |
| sortOrder | No | Sort direction, default DESC (newest year / largest first). | |
| charterClass | No | Filter 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is exceptionally transparent about behavior beyond annotations. It discloses roll-up honesty (never sum roll-ups with jurisdiction rows), the exact meaning of netInterestIncomeUSD (income, not margin), money scaling ($thousands to whole USD), null vs zero handling, error conditions (non-int year rejected pre-fetch, only honest empty), and the key on CERT vs SAM. This far exceeds the readOnlyHint/openWorldHint annotations, which are minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but highly structured, with bullet-like formatting (★ and HONESTY sections) that front-loads the core purpose and then provides necessary details. Each sentence adds value, particularly the honesty and edge-case notes. While not as concise as the ideal, the density is justified given the complexity and potential for misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explicitly lists the exact return structure with all fields. It also covers error handling, scaling, roll-up semantics, and differentiation from related tools. Everything an agent needs to correctly call and interpret the tool is present, including the note about FDIC keying on CERT. The completeness is outstanding for a complex aggregate tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema description coverage is 100% and the schema already explains parameters, the description adds valuable context by reiterating key constraints (STALP vs PSTALP, roll-up codes, charter class behavior) and introduces the 'ROLL-UP HONESTY' and money-scaling notes that clarify how parameters like state and year affect results. This goes beyond mere repetition, though much is redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides FDIC banking-sector annual aggregates with specific fields (assets, deposits, net income, etc.) for the whole US or one state, split by charter class. It differentiates from siblings like fdic_search_institutions by explicitly stating there is no name/city filter and directing drill-down there. The verb 'returns' and resource 'FDIC /summary' 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: for aggregate data, and when not: for name/city search, directing to fdic_search_institutions. It also clarifies filter usage, including the STALP vs PSTALP nuance and charter class handling. The 'HONESTY' sections provide critical usage cautions about roll-ups and data scaling, leaving no ambiguity about proper invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_institution_financialsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | Yes | REQUIRED FDIC certificate number of the institution (→ CERT filter). From fdic_search_institutions. | |
| limit | No | Rows per page, 1..1000, default 100. | |
| offset | No | 0-based row offset for pagination, 0..100000, default 0. | |
| sortBy | No | Sort field (allowlisted enum; default REPDTE = report date). | |
| sortOrder | No | Sort direction, default DESC (newest quarter first). |
TDQS
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.
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.
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.
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.
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.
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_historyARead-only
Institution-level STRUCTURAL-CHANGE event log for FDIC-insured banks (keyless; api.fdic.gov/banks/history) — mergers, absorptions, consolidations, failures, name/location/charter/regulator changes, branch open/close, trust-power grants & FRS-membership. CERT-linked merger lineage: each row carries acquiring/outgoing/surviving institution CERT + name, linking to fdic_search_institutions / fdic_bank_failures. Filters (all optional, AND-combined): cert (→CERT, PRIMARY lookup), changeCode (→CHANGECODE; e.g. 223=merger, 211=failure, 721=branch closing), effYear (→EFFYEAR), state (2-letter → PSTALP — NOTE: /history uses PSTALP, NOT STALP). limit (≤1000), offset (≤100000), sortBy (EFFDATE/PROCDATE/CHANGECODE/TRANSNUM), sortOrder. Returns { history:[{ cert, instName, state, changeCode, changeDescription, effectiveDate, processDate, effYear, transNum, acquirerCert, acquirerName, outgoingCert, outgoingName, survivingCert, survivingName, id }] }. NO name/city filter — FDIC /history search returns 0 for INSTNAME (a false-empty); resolve CERT via fdic_search_institutions first. HONESTY: totalAvailable is EXACT meta.total; changeDescription is FDIC's CHANGECODE_DESC verbatim (changeCode is authoritative — never hand-mapped); effectiveDate/processDate normalized to ISO YYYY-MM-DD (unrecognized → surfaced raw); acquirer/outgoing/surviving CERTs null on non-merger events (null-never-0); ONLY honest empty is meta.total:0/data:[] → complete:true/total:0; any other envelope THROWS (never fake-empty). NOTE: FDIC keys on CERT, not SAM UEI/DUNS.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | No | Filter 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. | |
| limit | No | Rows per page, 1..1000, default 100. | |
| state | No | Filter by 2-letter US state code (uppercase; → PSTALP filter — the /history state field is PSTALP, NOT STALP). e.g. 'CA'. | |
| offset | No | 0-based row offset for pagination, 0..100000, default 0. | |
| sortBy | No | Sort field (allowlisted enum; default EFFDATE = effective date). An unknown field is rejected before fetch. | |
| effYear | No | Filter by the year the structural change took effect (→ EFFYEAR filter). 1782..current UTC year (1782 = the oldest observed EFFYEAR). | |
| sortOrder | No | Sort direction, default DESC (newest structural change first). | |
| changeCode | No | Filter 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint and openWorldHint, so the description carries the behavioral burden and exceeds it: keyless access, exact meta.total semantics, null-never-0 for non-merger CERTs, date normalization rules, authoritative changeCode behavior, and throw-on-unexpected-envelope handling. The only-honest-empty condition is spelled out precisely, which is exactly the disclosure an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and the event-type scope, followed by filters, response shape, and critical caveats. It is long and repeats some schema details such as example change codes and sort defaults, but the density is justified by the API's unusual behavioral traps.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a keyless read-only API with no output schema, this description covers the endpoint, primary lookup path, all filter mappings, return field names, pagination and sorting options, date normalization, and exact empty/error behavior. An agent can correctly construct and interpret a call without external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with already detailed per-parameter descriptions, so the baseline is 3. The description adds cross-cutting semantic guidance: all filters are optional and AND-combined, the PSTALP-vs-STALP trap, the absence of name/city filtering with a false-empty warning, and the intended CERT-first lookup strategy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States clearly it is an institution-level structural-change event log for FDIC-insured banks and enumerates the event types: mergers, absorptions, failures, name/location/charter changes, and more. This distinguishes it from sibling FDIC tools such as fdic_bank_failures and fdic_institution_financials without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs that name/city lookups are not supported and that CERT must be resolved via fdic_search_institutions first, warning that the FDIC /history search returns a false-empty for INSTNAME. It also links to fdic_bank_failures for related lineage but does not systematically contrast this tool with every FDIC sibling, so it stops short of a full when-to-use matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_risk_ratiosARead-only
FDIC risk ratios for ONE institution by certificate number (keyless; api.fdic.gov/banks/financials) — 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) + tier-1 capital level. Input: cert (REQUIRED FDIC certificate, from fdic_search_institutions), reportDate (optional YYYYMMDD quarter-end → REPDTE; omit for full quarterly time-series), limit (≤1000), offset, sortBy (REPDTE/ROA/ROE/RBCRWAJ/EEFFR), sortOrder. Returns { cert, ratios:[{ cert, reportDate, cblrFramework, returnOnAssetsPct, preTaxReturnOnAssetsPct, returnOnEquityPct, netInterestMarginPct, efficiencyRatioPct, netChargeOffsToLoansPct, leverageRatioPct, tier1RiskBasedCapitalRatioPct, totalRiskBasedCapitalRatioPct, tier1CapitalUSD, id }] }. ★UNITS: every *Pct field is FDIC-published PERCENTAGE verbatim (no scaling); tier1CapitalUSD is $thousands × 1000. ★NULL-NEVER-0: not-reported ratio is null (never 0). ★CBLR banks (cblrFramework:true) do NOT report risk-based capital ratios — FDIC returns literal 0 for totalRiskBased only; this tool maps 0→null for BOTH tier1RiskBased and totalRiskBased; null is a framework artifact, not a 0% red flag — read alongside leverageRatioPct. No ratio is recomputed; each is FDIC's published Call-Report figure verbatim. HONESTY: totalAvailable is EXACT meta.total; ONLY honest empty is meta.total:0/data:[] → complete:true/total:0; any other envelope THROWS. NOTE: regulatory metrics, NOT a soundness rating. FDIC keys on CERT, not SAM UEI/DUNS.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | Yes | REQUIRED FDIC certificate number of the institution (→ CERT filter). From fdic_search_institutions. | |
| limit | No | Rows per page, 1..1000, default 100. | |
| offset | No | 0-based row offset for pagination, 0..100000, default 0. | |
| sortBy | No | Sort field (allowlisted enum; default REPDTE = report date). An unknown field is rejected before fetch. | |
| sortOrder | No | Sort direction, default DESC (newest quarter first). | |
| reportDate | No | Optional report date (→ REPDTE filter), a quarter-end as a YYYYMMDD integer (e.g. 20240630). Omit for the full quarterly ratio time-series. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: the null-never-0 convention, the CBLR 0→null mapping, the exact totalAvailable semantics, the 'no ratio is recomputed' guarantee, and the note that these are regulatory metrics not a soundness rating. It also discloses the keying on CERT rather than SAM UEI/DUNS. This is rich, honest behavioral disclosure that goes far 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core purpose and required input, then uses labeled sections (★UNITS, ★NULL-NEVER-0, HONESTY, NOTE) to convey critical caveats. Every sentence earns its place — the units warning, the null convention, the CBLR artifact, and the honesty contract are all essential for correct use. It loses one point because the density is high and the CBLR explanation is somewhat intricate, but the structure (labeled callouts) mitigates this.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only data-fetch tool with 100% schema coverage, no output schema, and rich annotations, the description is complete. It covers the input contract, the output shape, the units, the null semantics, the pagination envelope, the error behavior, and the regulatory caveat. An agent has everything needed to call this tool correctly and interpret the results without guessing. The sibling context (fdic_search_institutions for cert lookup) is also provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 6 parameters. The description adds meaningful semantics beyond the schema: it explains that `cert` comes from fdic_search_institutions, that `reportDate` maps to REPDTE and omitting it yields the full time-series, that `limit` is capped at 1000, and that `sortBy` values map to specific fields (REPDTE/ROA/ROE/RBCRWAJ/EEFFR). It also clarifies the return shape. The only minor gap is that the description doesn't restate the default values for limit/offset/sortOrder, but those are in the schema. A 4 is appropriate because the description adds real semantic value on top of a fully-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('returns FDIC risk ratios'), a precise resource ('ONE institution by certificate number'), and the exact data source (api.fdic.gov/banks/financials). It enumerates the ratio families (profitability, net interest margin, efficiency, asset quality, capital adequacy) and distinguishes itself from sibling tools by emphasizing 'ONE institution' and the keyless FDIC endpoint. This is unambiguous and clearly differentiated from fdic_institution_financials and fdic_industry_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the required input (`cert` REQUIRED, sourced from fdic_search_institutions), explains when to omit `reportDate` (for full quarterly time-series), and provides the exact envelope semantics (only honest empty is meta.total:0/data:[]; any other envelope THROWS). It also gives a clear exclusion: CBLR banks do not report risk-based capital ratios, so the tool maps 0→null for both tier1RiskBased and totalRiskBased. This is explicit when-to-use and what-to-expect guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_search_institutionsARead-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 filters — filters=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.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | No | Filter by FDIC certificate number (the STABLE entity key; → CERT filter). | |
| city | No | Filter by CITY via FDIC full-text `search` (case-insensitive token match). | |
| name | No | Filter 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`). | |
| limit | No | Rows per page, 1..1000, default 100. | |
| state | No | Filter by 2-letter US state code (uppercase; → STALP filter). e.g. 'VA'. | |
| offset | No | 0-based row offset for pagination, 0..100000, default 0. | |
| sortBy | No | Optional sort field (an allowlisted enum; an unknown field is rejected before fetch). | |
| sortOrder | No | Sort direction when sortBy is set, ASC (default) or DESC. | |
| activeOnly | No | Filter to active (true → ACTIVE:1) or inactive (false → ACTIVE:0) institutions; omit for both. |
TDQS
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.
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.
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.
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.
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.
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_documentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| documentNumber | Yes | Federal Register document number, e.g. '2026-08333' |
TDQS
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.
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.
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.
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.
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.
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_agenciesARead-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?'
| Name | Required | Description | Default |
|---|---|---|---|
| perPage | No |
TDQS
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.
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.
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.
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.
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.
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_inspectionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-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. | |
| mode | No | Retrieval 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`). | |
| term | No | Full-text query; VALID only in mode='search'. Rides conditions[term] (server-side). | |
| type | No | Client-side document-type filter (applied in all modes). | |
| limit | No | Page size (default 20). | |
| agency | No | Client-side agency-slug filter; matches ANY of a doc's agencies[].slug. Resolve slugs via fed_register_list_agencies. | |
| offset | No | Page offset (default 0). | |
| specialOnly | No | Client-side filter keeping only filing_type='special' (off-cycle/emergency — a stronger, sooner signal). |
TDQS
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.
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.
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.
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.
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.
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_documentsARead-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?').
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Document type | |
| query | No | ||
| perPage | No | ||
| agencySlugs | No | Federal Register agency slugs, e.g. ['veterans-affairs-department']. Use fed_register_list_agencies to resolve. | |
| effectiveDateFrom | No | YYYY-MM-DD | |
| publicationDateTo | No | YYYY-MM-DD | |
| publicationDateFrom | No | YYYY-MM-DD |
TDQS
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.
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.
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.
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.
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.
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.
feedbackARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What kind of report: bug (default), feature (a capability this server lacks), or wrong_output (a tool returned a wrong/suspicious result). | |
| tool | No | The tool name this is about, if any (e.g. 'sam_search_opportunities'). | |
| summary | No | A short one-line summary for the issue title/body. PUBLIC — never include API keys, personal data, or sensitive query values. |
TDQS
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.
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.
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.
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.
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.
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_declarationsARead-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'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page ($top), 1..1000, default 100. | |
| state | No | Filter by state (→ state eq 'XX'). 2-letter code. | |
| offset | No | 0-based row offset ($skip) for pagination, default 0. | |
| fyDeclared | No | Filter by fiscal year declared (→ fyDeclared eq N). e.g. 2024. | |
| incidentType | No | Filter by incident type (→ incidentType eq '...'). e.g. 'Flood', 'Hurricane', 'Winter Storm'. | |
| declaredDateTo | No | Latest declaration date, inclusive (→ declarationDate le 'ISO'). | |
| disasterNumber | No | Filter by FEMA disaster number (→ disasterNumber eq N). | |
| declarationType | No | Filter by declaration type (→ declarationType eq 'XX'): DR (major disaster), EM (emergency), FM (fire management). | |
| declaredDateFrom | No | Earliest declaration date, inclusive (→ declarationDate ge 'ISO'). | |
| iaProgramDeclared | No | Filter to declarations where the Individual Assistance program was declared (→ iaProgramDeclared eq true/false). | |
| paProgramDeclared | No | Filter to declarations where the Public Assistance program was declared (→ paProgramDeclared eq true/false). |
TDQS
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.
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.
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.
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.
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.
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_mitigationARead-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'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page ($top), 1..1000, default 100. | |
| state | No | Filter 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. | |
| offset | No | 0-based row offset ($skip) for pagination, default 0. | |
| region | No | Filter by FEMA region number 1–10 (→ region eq N). | |
| status | No | Filter by project status (→ status eq '...'). e.g. 'Closed', 'Open'. | |
| programFy | No | Filter by program fiscal year (→ programFy eq N). e.g. 2005. | |
| programArea | No | Filter 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. | |
| disasterNumber | No | Filter by FEMA disaster number (→ disasterNumber eq N). | |
| maxProjectAmount | No | Maximum project amount (→ projectAmount le N). | |
| minProjectAmount | No | Minimum project amount (→ projectAmount ge N). |
TDQS
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.
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.
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.
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.
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.
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_assistanceARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page ($top), 1..1000, default 100. | |
| state | No | Filter by applicant state (→ stateAbbreviation eq 'XX'). 2-letter code. | |
| offset | No | 0-based row offset ($skip) for pagination, default 0. | |
| applicantId | No | Filter by applicant id (→ applicantId eq '...'). e.g. '015-UF5E0-00'. | |
| incidentType | No | Filter by incident type (→ incidentType eq '...'). e.g. 'Flood', 'Hurricane', 'Severe Storm'. | |
| declaredDateTo | No | Latest declaration date, inclusive (→ declarationDate le 'ISO'). | |
| disasterNumber | No | Filter by FEMA disaster number (→ disasterNumber eq N). | |
| declaredDateFrom | No | Earliest declaration date, inclusive (→ declarationDate ge 'ISO'). | |
| maxProjectAmount | No | Maximum project amount (→ projectAmount le N). | |
| minProjectAmount | No | Minimum project amount (→ projectAmount ge N). | |
| damageCategoryCode | No | Filter by PA damage category code (→ damageCategoryCode eq 'X'). e.g. 'B' = Emergency Protective Measures, 'C'–'G' = permanent work. |
TDQS
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.
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.
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.
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.
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.
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_awardsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| piid | No | Contract/order PIID (→ PIID) — returns that action's full base+mod chain. | |
| naics | No | Principal NAICS code (→ PRINCIPAL_NAICS_CODE), e.g. '541511'. | |
| offset | No | 0-indexed page start (page size fixed at 10). Keyless deep-paging past ~200K is unreliable. | |
| keyword | No | Free-text keyword (bare full-text term; FPDS FIELD: operators are stripped for safety). | |
| vendorName | No | Vendor/contractor name phrase (→ VENDOR_NAME), e.g. 'LOCKHEED MARTIN'. | |
| departmentId | No | 4-digit contracting DEPARTMENT_ID, e.g. '9700' (DoD), '4700' (GSA). | |
| signedDateTo | No | Signed-date range END (ISO YYYY-MM-DD); pair with signedDateFrom. | |
| lastModifiedTo | No | Last-modified range END (ISO YYYY-MM-DD); pair with lastModifiedFrom. | |
| signedDateFrom | No | Signed-date range START (ISO YYYY-MM-DD); pair with signedDateTo (→ SIGNED_DATE:[from,to]). | |
| lastModifiedFrom | No | Last-modified range START (ISO YYYY-MM-DD); pair with lastModifiedTo (→ LAST_MOD_DATE:[from,to]). | |
| contractingAgencyName | No | Contracting agency name phrase (→ CONTRACTING_AGENCY_NAME), e.g. 'DEPT OF DEFENSE'. |
TDQS
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.
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.
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.
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.
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.
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_seriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max series to return (default 25, max 1000). Offset-paginated. | |
| query | Yes | The FRED search_text — free-text terms to discover economic series, e.g. 'unemployment rate', 'CPI', 'GDP', '10-year treasury'. Required. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. |
TDQS
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.
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.
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.
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.
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.
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_observationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max observations to return (default 100, max 100000). Offset-paginated. | |
| offset | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| endDate | No | Latest observation date (YYYY-MM-DD). Maps to FRED observation_end. | |
| seriesId | Yes | A 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. | |
| sortOrder | No | Observation date order: 'asc' (oldest first, FRED default) or 'desc' (newest first). | |
| startDate | No | Earliest observation date (YYYY-MM-DD). Maps to FRED observation_start. |
TDQS
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.
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.
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.
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.
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.
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_lookupARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max decisions to return (default 20, max 50). The feed itself carries ~25 recent legal products. | |
| agency | No | Client-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. | |
| enrich | No | Fetch 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). | |
| bNumber | No | Fetch 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. | |
| outcome | No | Filter by protest disposition (default 'any'). Determined from each decision page, so it applies only when enrich is true. | |
| protester | No | Client-side substring filter on the protester name (feed title/description). | |
| solicitationNumber | No | Client-side substring filter on the solicitation number (matched in the feed description). |
TDQS
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.
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.
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.
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.
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.
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_packageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| packageId | Yes | GovInfo packageId from govinfo_search_packages (e.g. 'BILLS-118hr1enr', 'PLAW-117publ58', 'CFR-2023-title1-vol1', 'GAOREPORTS-GAO-24-106221'). |
TDQS
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.
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.
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.
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.
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.
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_collectionsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_packagesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Optional upper bound on lastModified (same format as startDate). | |
| pageMark | No | Opaque continuation cursor. Default "*" (first page). To page, pass back the previous response's _meta.nextCursor (NOT a numeric offset — GovInfo uses an opaque cursor). | |
| pageSize | No | Rows per page (upstream pageSize), 1..1000, default 100. | |
| startDate | Yes | Lower 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'. | |
| collection | Yes | GovInfo 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
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.
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.
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.
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.
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.
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_opportunityARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| opportunityId | Yes | Grants.gov opportunity id (numeric string) |
TDQS
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.
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.
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.
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.
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.
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.
grants_searchARead-only
Search Grants.gov federal grant opportunities (financial assistance, distinct from contracts on SAM.gov). Filter by keyword / CFDA / agency / opportunity number. Default status = forecasted + posted. KEYWORD: Grants.gov OR-matches multi-word keywords (returns grants containing ANY word), so a multi-word keyword BROADENS results — pass ONE specific term for relevance (phrase quoting returns 0); narrow with cfda/agency/oppStatuses.
| Name | Required | Description | Default |
|---|---|---|---|
| cfda | No | CFDA program number, e.g. '10.500' | |
| rows | No | ||
| agency | No | Grants.gov agency code, e.g. 'DHS-FEMA' | |
| oppNum | No | Specific opportunity number | |
| keyword | No | ||
| oppStatuses | No | Defaults to forecasted+posted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint. The description adds valuable behavioral details such as OR-matching for keywords, phrase quoting returning 0, and default statuses. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and filtering, then provides keyword behavior details. It is somewhat lengthy but each sentence adds value. Could be slightly more concise, but it is well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description could mention what the search results contain (e.g., grant opportunity summaries). It covers filtering and defaults but lacks information on result structure or pagination. The annotations partially compensate with openWorldHint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, setting a baseline of 3. The description adds meaningful nuance for the keyword parameter (OR matching, phrase quoting behavior), but does not elaborate on other parameters beyond what the schema provides. It briefly mentions narrowing with cfda/agency/oppStatuses, which is already implied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Search' and resource 'Grants.gov federal grant opportunities', and distinguishes from SAM.gov contracts, which is valuable given sibling tools from SAM.gov. It also lists key filtering capabilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed guidance on keyword usage and narrowing with other parameters, and distinguishes from SAM.gov contracts. However, it does not explicitly mention when to use this tool over the sibling grants_get_opportunity or other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsa_benchmark_labor_ratesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sin | No | Schedule SIN filter (e.g. '54151S'). | |
| priceRange | No | Ceiling-price range as 'min,max' (e.g. '50,150'). | |
| businessSize | No | Business size filter: 'S' (small) or 'O' (other-than-small). | |
| laborCategory | Yes | Labor category to benchmark (e.g. 'Program Manager', 'Software Engineer'). Matched exactly against CALC's labor_category. | |
| educationLevel | No | Education filter — use CALC's SHORT CODES (e.g. 'HS','AA','BA','MA','PHD'); the displayed education_level field may show full words. | |
| maxSamplePages | No | How many 20-row pages to sample for the distribution (default 3, max 10). | |
| experienceRange | No | Experience range as 'min,max' (e.g. '5,10'). | |
| minYearsExperience | No | Minimum years of experience filter. |
TDQS
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.
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.
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.
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.
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.
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_ratesARead-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 + state (2-letter) OR zip (5-digit) — supplying BOTH or NEITHER → invalid_input with 0 fetch; optional year (default: current federal fiscal year). Returns { rates:[{ city, county, state, zip, year, isOconus, standardRate, mealsUsd, monthlyLodgingUsd:[{ month (1-12), monthName, lodgingUsd }] }] } + honest _meta. HONESTY: lodgingUsd is the MAX nightly lodging ceiling for that month — VARIES SEASONALLY (hence a per-month array); mealsUsd is the daily M&IE ceiling; both are integer US dollars, null-when-withheld (NEVER 0 — genuine 0 preserved). standardRate/isOconus are booleans coerced from the API's string 'true'/'false' (unrecognized → null, never fabricated false); months array preserved AS-IS (never padded to 12). API returns COMPLETE rate set (no pagination) → totalAvailable = row count, complete:true. Genuine no-match → honest empty; errors field non-null → invalid_input; 429 (DEMO_KEY ~10 req/hr) → rate_limited THROWS; set DATA_GOV_API_KEY (free, api.data.gov/signup) for 1000/hr. 5xx/timeout → upstream_unavailable THROWS; 200 non-JSON → schema_drift. Key rides ONLY in the X-Api-Key header.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | A 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. | |
| city | No | The city name (e.g. 'Washington', 'San Francisco'). Requires `state`. Validated ^[A-Za-z .'\-]{1,60}$. Use EITHER (city + state) OR zip — not both. | |
| year | No | The 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). | |
| state | No | The 2-letter state/territory code (e.g. 'DC', 'CA'). Required with `city`. Validated ^[A-Za-z]{2}$. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations claim readOnlyHint=true and openWorldHint=true; the description does not contradict these. It goes far beyond annotations by detailing null-when-withheld behavior, boolean coercion rules, no pagination, error condition mapping, authentication requirements, rate limits, and honest empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but every sentence adds essential information: purpose, input constraint, return shape, honesty rules, error behavior, auth. The purpose is front-loaded; subsequent sentences are dense but organized. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the return object shape and field semantics. It also covers error codes, rate limits, authentication setup, and edge cases like null vs 0 and month array preservation. An agent has all necessary details to invoke and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds beyond schema by explaining that providing both or neither city+state and zip causes invalid_input with 0 fetch, that year rides in the request path, and that the API key must ride in the X-Api-Key header. This enriches the schema's already good parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Look up GSA Federal Travel PER-DIEM rates' and defines what the rates mean (maximum lodging + M&IE reimbursement ceilings). It clearly distinguishes from siblings like gsa_benchmard_labor_rates and sam_get_wage_rates by limiting scope to federal travel per-diem.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context: it is for official U.S. government travel per-diem lookup. It specifies the two valid input modes (city+state or zip) and explicitly says providing both or neither is invalid. It does not name sibling alternatives, but the niche is narrow and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hts_lookupARead-only
Look up US import-tariff classification + duty rates from the USITC Harmonized Tariff Schedule (keyless; hts.usitc.gov/reststop/search). A single query serves BOTH modes: KEYWORD (e.g. 'laptop') OR HTS number (e.g. '8471.30'). Returns { query, lines:[{ htsno, statisticalSuffix, indent, description, units, columnOneGeneral, specialPreferential, columnTwo, additionalDuties, footnotes, quotaQuantity, effectivePeriod, status, isChapter99 }] } + honest _meta. ★DUTY-RATE HONESTY: columnOneGeneral, specialPreferential, and columnTwo are AUTHORITATIVE VERBATIM TEXT — 'Free', '35%', '0.47¢/kg', compound/range, or null — NEVER coerced to a number (0/NaN fabricates a false 'duty-free'); empty Special ('') → null = NO special rate (NEVER read as Free). ★HIERARCHY: rate stated at a shallower level and inherits downward; read to the nearest ancestor with a non-empty rate; blank deepest ≠ 'no duty'. ★ADDITIONAL DUTIES: additionalDuties is frequently null even when Section 301/232 duties apply — the real additional duty rides Chapter-99 rows (isChapter99:true) and STACKS on the base rate. ★COMPLETENESS: endpoint returns the FULL match array; offset IGNORED → totalAvailable is the EXACT served array length; paging CLIENT-SIDE. query must be ≥3 non-whitespace chars (1-2 → invalid_input). limit (≤200, def 50), offset. No-match → honest empty; 404/5xx/timeout/non-array/HTML → schema_drift THROW; transient 400 → upstream_unavailable. NOT a binding CBP ruling or landed-cost quote — duty owed depends on country of origin + trade program + Ch-99 stacking; confirm via CBP (CROSS/eRulings).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page (CLIENT-SIDE slice over the served array), 1..200, default 50. | |
| query | Yes | REQUIRED — 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. | |
| offset | No | 0-based row offset for CLIENT-SIDE pagination over the served array (the endpoint has no server-side pagination), default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint and openWorldHint, but the description goes well beyond them. It discloses critical behavioral nuances: duty rates are authoritative verbatim text and never coerced to numbers; empty Special equals no special rate; hierarchy inheritance rules; additional duties often ride Chapter-99 rows; completeness guarantees about arrays and offset behavior; and explicit error-handling protocol (schema_drift THROW, upstream_unavailable). This adds substantial context beyond annotations with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but extremely long, running into two dense paragraphs with multiple bolded subsections. While every sentence carries valuable information, the sheer length exceeds what is necessary for a typical tool definition. It is front-loaded with purpose, but the extensive use of ★ headers and repeated warnings makes it less concise than ideal. It is not a tautology, but it could be trimmed without losing essential guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining the return structure, which it does exhaustively: it lists all fields of the `lines` array, explains the honesty guarantees, and covers error handling, pagination, and disclaimers. For a complex tool with 3 params and no output schema, this is as complete as an agent could need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds some semantic details beyond the schema (e.g., 'both ride the keyword= search', client-side pagination, and >3 char requirement), but these are also largely reflected in the schema's own parameter descriptions. The added value is marginal and does not significantly enhance understanding beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource ('Look up US import-tariff classification + duty rates from the USITC Harmonized Tariff Schedule') and immediately clarifies the dual-mode query (KEYWORD or HTS number). It distinguishes itself from any potential sibling by being uniquely tied to USITC tariff data, and the resource and action are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when not to use this tool ('NOT a binding CBP ruling or landed-cost quote') and directs the agent to an alternative ('confirm via CBP (CROSS/eRulings)'). It also explains the scope and limitations, providing clear context for when this tool is appropriate versus when to consult other sources. This covers both when and when-not clearly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lda_search_filingsARead-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; optional free LDA_API_KEY only raises the rate limit). Filters (all optional): registrantName (the lobbying firm/in-house filer), clientName, lobbyistName, filingYear (4-digit), filingType (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, page (1-based), pageSize (1..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 (corpus ~1.95M filings) — NOT the rows on this page; pagination is page-based. incomeUsd/expensesUsd parsed from null-or-decimal-string — null (not reported) → null, NEVER 0 (genuine 0 stays 0); a filing reports EITHER income OR expenses, so the other is typically null. Missing lobbying_activities/government_entities → empty arrays. Genuine no-match → honest empty; 400 → invalid_input; 429 → rate_limited THROWS (Retry-After honored); 5xx/timeout THROWS; 200 non-JSON/non-array results/non-number count → schema_drift. Token rides ONLY in the Authorization: Token header.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number (default 1). Page with the next page number from _meta.notes / when _meta.pagination.hasMore. | |
| issue | No | Filter by the specific lobbying issues text (maps to filing_specific_lobbying_issues), e.g. 'appropriations'. | |
| agency | No | NOTE: /filings/ has NO server-side government-entity filter — the LDA API silently ignores this field (reported in _meta.filtersDropped, never as a narrowed total). Government entities are nested per activity in lobbyingActivities[].governmentEntities; narrow by registrantName/clientName/issue and inspect those nested entities. Retained for discoverability. | |
| pageSize | No | Filings per page, 1..25 (the LDA API caps at 25), default 25. | |
| clientName | No | Filter by the client name (who the lobbying is FOR), e.g. 'Google'. Substring match, upstream-validated. | |
| filingType | No | Filter 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). | |
| filingYear | No | Filter by filing year, a 4-digit year (e.g. '2024'). Validated ^\d{4}$. | |
| lobbyistName | No | Filter by an individual lobbyist's name. Substring match, upstream-validated. | |
| registrantName | No | Filter by the registrant (the lobbying firm / in-house filer) name, e.g. 'Akin Gump'. Substring match, upstream-validated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
This is exceptionally transparent. It discloses that the agency filter is silently dropped and reported in _meta.filtersDropped, that totalAvailable is the real corpus count rather than page rows, that null income/expenses stays null rather than becoming 0, that missing nested fields return empty arrays, and that the token must travel only in the Authorization header. It also details error-throwing behavior and schema_drift detection. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every clause earns its place: filters, response shape, honest pagination semantics, null handling, error taxonomy, and auth placement. It is front-loaded with the core purpose and access model, then cascades into expected behaviors. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining the return shape, and it does so thoroughly: filings fields, lobbyingActivities nesting, governmentEntities, documentUrl, postedDate, terminationDate, and _meta. It also covers edge cases and failure modes, making the tool safely callable by an agent without external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description adds some context, such as the agency filter caveat and the optional key behavior, but the schema already provides thorough per-parameter descriptions including examples, validation patterns, and the same agency caveat. The description's parameter-level contribution is marginal beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Search US Senate LDA (Lobbying Disclosure Act) filings". It clearly explains the domain (who is paid to lobby which agency on which issue) and names the underlying API, making it distinguishable from the many other search tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use it — whenever an agent needs LDA lobbying disclosure filing data — and gives practical access guidance (keyless anonymous access, optional API key only affects rate limits). It does not explicitly name alternative tools or exclusion conditions, but no sibling provides equivalent LDA filing search functionality, so the absence of explicit alternatives is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nhtsa_complaintsARead-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}$.
| Name | Required | Description | Default |
|---|---|---|---|
| make | Yes | Vehicle make (required), e.g. 'honda', 'ford'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$). | |
| model | Yes | Vehicle model (required), e.g. 'accord', 'f-150'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$). | |
| modelYear | Yes | 4-digit model year (required), e.g. '2020'. Validated ^\d{4}$. |
TDQS
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.
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.
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.
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.
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.
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_recallsARead-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}$.
| Name | Required | Description | Default |
|---|---|---|---|
| make | Yes | Vehicle make (required), e.g. 'honda', 'ford'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$). | |
| model | Yes | Vehicle model (required), e.g. 'accord', 'f-150'. Letters/digits/space/hyphen only (^[A-Za-z0-9 -]+$). | |
| modelYear | Yes | 4-digit model year (required), e.g. '2020'. Validated ^\d{4}$. |
TDQS
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.
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.
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.
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.
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.
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_projectsARead-only
Search awarded NIH RePORTER research-grant projects (keyless; api.reporter.nih.gov v2, POST/JSON), joinable to SAM/USAspending via primary_uei. LIVE-CONFIRMED-narrowing criteria ONLY, AND-combined: orgStates (UPPERCASE 2-letter USPS — lowercase/unknown code silently returns zeros), orgNames (≤512 chars each, ≤20 names), fiscalYears (int array, 1985..currentYear+1, ≤20), limit (1..500), offset (0..14,999). Returns { projects:[{ projectNum, projectTitle, fiscalYear, awardAmount, organization:{name, state, primaryUei, primaryDuns, ueis, duns}, principalInvestigators, contactPiName, fundingIc }] } + honest _meta. HONESTY: records are RESEARCH GRANTS, NOT procurement contracts — primaryUei joins SAM/USAspending but the award nature differs (disclosed in every _meta.notes). totalAvailable = 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; past the window the count stays exact while records are UNREACHABLE (disclosed in a note). An unscoped query returns the first page + exact total + narrow-your-criteria note. agencyIcCodes is NOT a filter (NIH silently drops it — would be a false 'applied'). awardAmount is number|null (genuine $0 is 0, absent is null). Genuine total:0 → complete:true/total:0; outage/5xx THROWS; 400 (bad offset/limit/type) → invalid_input; 200 not {meta,results} or non-numeric meta.total → schema_drift.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Projects per page (upstream hard cap 500), 1..500, default 50. | |
| offset | No | 0-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. | |
| orgNames | No | Recipient-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. | |
| orgStates | No | Recipient-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. | |
| fiscalYears | No | NIH fiscal years to include (int array, 1985..2027, max 20). LIVE-CONFIRMED to narrow. e.g. [2023,2024]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses many non-obvious behaviors: silent zero returns for lowercase/unknown state codes, NIH's 15,000-record cap, offset ≥15,000 refusal, agencyIcCodes being silently dropped, exact total semantics, error type classification, and schema_drift handling. This is far more than annotations provide and is a model of transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is well-structured with front-loaded purpose and uppercase markers ('LIVE-CONFIRMED', 'HONESTY'). Every paragraph delivers actionable caveats, and although 'keyless' is repeated twicejam and the prose is dense, the complexity of the NIH API behavior justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description provides the complete return shape ({projects:[...]} plus honest _meta), error mapping for 400/5xx/schema_drift, filtering constraints, cap details, and destinction from procurement contracts. An agent has everything needed to call this tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents every parameter richly (100% coverage), so the baseline is 3. The description adds extra behavioral meaning—for example, orgStates values are an 'SSRF value guard + silent-zero guard,' all filters are 'LIVE-CONFIRMED to narrow,' and agencyIcCodes is explicitly called out as a non-filter. That additional context justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search awarded NIH RePORTER research-grant projects.' It also names the exact API (api.reporter.nih.gov v2, POST/JSON) and keyless access, which distinguishes it from sibling tools like NSF awards or USAspending without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: it covers NIH research grants, explicitly warns they are 'NOT procurement contracts,' and notes that primary_uei joins SAM/USAspending while the award nature differs. It also advises that unscoped queries return a narrowing notetee. However, it does not explicitly name sibling alternatives, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nist_800_53_controlsARead-only
Look up NIST SP 800-53 Rev 5 security & privacy CONTROLS (keyless) — the requirement backbone for FedRAMP / CMMC / RMF compliance work. Complements cve_lookup + cisa_kev_lookup. Retrieve by controlId (exact, e.g. 'AC-2', 'SC-7', 'AC-2(1)'), family (2-letter 'AC'/'SC'/'IA' or name substring), and/or keyword (case-insensitive substring over title + statement); limit/offset pagination. Each row: { id, family, title, status ('withdrawn'|null), statement (requirement prose; NULL for a WITHDRAWN control, never ''), guidance (discussion), incorporatedInto:[ids that superseded a withdrawn control], enhancements:[{id,title}] }. HONESTY: source is NIST's OFFICIAL OSCAL catalog 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 (catalog fetched live from the MOVING 'main' branch, so control text can shift between point releases — cite the version); a WITHDRAWN control has statement:null and is NOT an active requirement (see incorporatedInto for what replaced it); filtering is CLIENT-SIDE and totalAvailable is the EXACT match count; applicability depends on the system's FIPS-199 impact baseline (Low/Moderate/High), which the catalog does not encode; a download failure or implausibly-truncated catalog (< 15 families) THROWS (never fake-empty).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max controls returned (default 25, max 200). | |
| family | No | Control family — the 2-letter code ('AC', 'SC', 'IA') OR a substring of the family name ('Access Control', 'Audit'). Case-insensitive. | |
| offset | No | Zero-based page offset (default 0). | |
| keyword | No | Case-insensitive substring searched over the control title + requirement statement. | |
| controlId | No | Exact control identifier, e.g. 'AC-2', 'SC-7', 'AC-2(1)' (case-insensitive; zero-padding is normalized). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations (readOnlyHint and openWorldHint only). It discloses the data source (GitHub OSCAL, not .gov host), the fact that the catalog is live from a moving branch and can shift between releases, the exact semantics of a withdrawn control (statement:null, not an active requirement, see incorporatedInto), that filtering is client-side with exact totalAvailable, and that a download failure throws. This is exemplary behavioral disclosure, directly under a 'HONESTY:' header, and it does not contradict 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It is front-loaded with the core purpose and retrieval methods, then structured into a clearly labeled 'HONESTY' section covering edge cases and restrictions. The structure is logical: purpose, complement framing, retrieval params, row format, then behavioral caveats. There is no filler or redundancy; density is high and justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 optional params, nuanced withdrawn-control behavior, external provenance), the description is remarkably complete. It defines the return row fields (id, family, title, status, statement, guidance, incorporatedInto, enhancements), explains the null-statement edge case, notes that the catalog does not encode FIPS-199 baselines, and preemptively addresses failure modes. Even without an output schema, an agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description meaningfully enriches the parameters. It explains controlId is case-insensitive and zero-padding normalized, family accepts either a 2-letter code or a name substring, keyword is a case-insensitive substring over title+statement, and limit/offset pagination. It also clarifies the output fields (status, statement, incorporatedInto, enhancements) which indirectly informs parameter use (e.g., why keyword searches title+statement). This is more than the schema alone, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with an explicit, specific statement of purpose: 'Look up NIST SP 800-53 Rev 5 security & privacy CONTROLS' — a clear verb+resource pair. It immediately frames the domain ('FedRAMP / CMMC / RMF compliance work') and names complementary siblings ('Complements cve_lookup + cisa_kev_lookup'), so an agent can distinguish it from nearby lookups without inspecting schemas. The retrieval methods (controlId, family, keyword) are enumerated, giving a complete sense of what the tool offers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it is for compliance work and is 'keyless' (no auth), and it notes that 'applicability depends on the system's FIPS-199 impact baseline'. It explicitly says it 'Complements cve_lookup + cisa_kev_lookup' and clarifies that withdrawn controls are not active requirements. However, it does not explicitly state 'use X when Y, use Z when not', so it falls just short of perfect routing guidance, but the context is strong enough to be unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nonprofit_financialsARead-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/). ★PROVENANCE: the DATA is IRS Form 990 filings (federal tax-exempt public records) but the API is ProPublica Nonprofit Explorer (NON-PROFIT newsroom) — NOT a .gov API; ProPublica republishes these records KEYLESS (no key). Input: ein (required — the Employer Identification Number, 1..9 digits, e.g. '530196605' for 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) ride null-never-0 coercion — genuine reported 0 stays 0, absent → null (NEVER 0-faked); ein/codes are strings; rulingDate is a date string. totalAvailable = filings.length (COMPLETE filing set — no pagination). Unknown EIN (HTTP 404) → not_found (NEVER fabricated empty org); 4xx → invalid_input; 429 → rate_limited THROWS; 5xx/timeout → upstream_unavailable THROWS; 200 non-JSON / non-object org / non-array filings → schema_drift. Data source disclosed in _meta.source.
| Name | Required | Description | Default |
|---|---|---|---|
| ein | Yes | The 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint and openWorldHint, but the description goes far beyond that. It details provenance (IRS filings via ProPublica, not a .gov API), the null-never-0 coercion rule for financial figures, string types for EIN/codes, error mapping (404→not_found, 4xx→invalid_input, 429→rate_limited, 5xx→upstream_unavailable, schema_drift), and the complete filing set without pagination. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense with necessary information: purpose, input, output, error handling, and honesty guarantees. It is front-loaded with the core purpose, then systematically covers behavior. While every sentence earns its place, the length is substantial; a more compact structure could improve scannability, but it is not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description is exceptionally complete. It specifies the exact return shape (organization and filings arrays with fields), details on null coercion, error codes for every failure mode, provenance, and the absence of pagination. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the ein parameter with format and example. The description repeats the example and adds that the EIN 'rides the URL path', which is a minor addition. Since the schema covers the parameter well, the baseline of 3 is appropriate; the description does not significantly enhance parameter understanding beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and a specific resource (ONE US tax-exempt nonprofit's IRS Form 990 profile + FINANCIALS by EIN), and clearly distinguishes it from search tools like nonprofit_search by emphasizing it fetches a single entity's financials. The inclusion of the data source (ProPublica) and the keyless access further clarifies 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys usage: it is for fetching one specific nonprofit's financials by EIN, and mentions that it returns a complete filing set with no pagination. It does not explicitly name alternatives or exclusion conditions, but the single-entity scope and the presence of sibling search tools make the intended use clear enough. A brief note on when to prefer it over nonprofit_search would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nonprofit_searchARead-only
Search US TAX-EXEMPT NONPROFITS (501(c) organizations) by IRS Form 990 data via ProPublica Nonprofit Explorer (projects.propublica.org/nonprofits/api/v2/search). ★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) — this is NOT a .gov API; ProPublica republishes these records KEYLESS because the IRS itself has no clean query API (only bulk downloads / a web UI). KEYLESS (no key of any kind). All inputs optional: query (full-text org name/keyword → q), state (2-letter code → state[id], ^[A-Za-z]{2}$), ntee (NTEE major category, integer 1..10 → ntee[id]), page (0-BASED, default 0). Returns { organizations:[{ ein, name, city, state, nteeCode, subsectionCode }] } + honest _meta. HONESTY: totalAvailable is the API's REAL total_results (the total match count for the query) — NOT the organizations on this page; pagination is page-based and 0-INDEXED (pass page=cur_page+1 when hasMore). ein/nteeCode/subsectionCode are strings (never num-coerced). A genuine no-match (organizations:[]) ⇒ honest empty (returned:0, complete:true); a 4xx ⇒ invalid_input; a 429 ⇒ rate_limited THROWS (Retry-After honored, never routed around); a 5xx/timeout ⇒ upstream_unavailable THROWS; a 200 non-JSON / non-array organizations / non-number total_results ⇒ schema_drift. Data is IRS Form 990 data via ProPublica Nonprofit Explorer, disclosed in _meta.source and a note.
| Name | Required | Description | Default |
|---|---|---|---|
| ntee | No | Filter by NTEE major category, an integer 1..10 (maps to ntee[id]) — the National Taxonomy of Exempt Entities top-level group (e.g. 1 Arts, 3 Environment, 8 Health). | |
| page | No | 0-BASED page number (default 0). Page with cur_page+1 from _meta.notes / when _meta.pagination.hasMore. | |
| query | No | Full-text query (maps to q) — an organization name or keyword, e.g. 'american red cross'. Matches across the org name/metadata. | |
| state | No | Filter by a 2-letter US state/territory code (maps to state[id]), e.g. 'VA'. Validated ^[A-Za-z]{2}$. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds extensive behavioral context beyond annotations: data provenance (IRS Form 990, ProPublica republishing), keyless access, error behavior (rate limiting with Retry-After, etc.), and return format details. Annotations only provide readOnlyHint and openWorldHint; description greatly enriches agent understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured: starts with core purpose, then provenance, keyless access, parameter details, error handling. Each sentence adds value; minimal redundancy. Could be slightly more concise but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains return structure (organizations array with fields, _meta with pagination), no-match behavior, error types, and data source. Combined with annotations, this is comprehensive for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with basic descriptions, but the tool description adds meaning: explains mapping to API query parameters (q, state[id], ntee[id]), default for page, and validation hints (state regex). This adds value beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches US tax-exempt nonprofits via IRS Form 990 data from ProPublica, specifying the exact data source and API. This distinguishes it from sibling tools like nonprofit_financials, which likely provide detailed financial data rather than search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed guidance on pagination (0-based, pass page=cur_page+1 when hasMore), error handling (4xx, 429, 5xx, schema drift), and how to interpret results (totalAvailable vs current page). It lacks explicit when-not-to-use or alternative tools, 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.
nppes_lookup_providerARead-only
Keyless CMS/HHS NPPES NPI Registry — every US healthcare provider (NPI-1 individual + NPI-2 organization). EXACT-NPI mode (when number supplied): NPI is CMS-Luhn-validated — typo'd NPI is invalid_input, NEVER a fake 'does not exist'; wire carries number+version ALONE — co-supplied filters are DROPPED from wire and checked CLIENT-SIDE (filterMatch:{field:bool} + filtersDropped) because NPPES AND-combines number+filters and a mismatch would falsely zero a real active provider. SEARCH mode: required-one of {first_name, last_name, organization_name, taxonomy_description, city, postal_code} (state + enumeration_type are REFINERS ONLY — rejected alone); trailing '*' wildcard needs ≥2 leading literal chars. Returns EXACT-mode { found, provider:{number, enumerationType, active, basic, taxonomies, addresses, practiceLocations, identifiers, otherNames, endpoints, createdEpoch, lastUpdatedEpoch}, filterMatch? } OR SEARCH { providers:[…] } + honest _meta. HONESTY: active = basic.status==='A'; epochs are ms numeric STRINGS → number|null; addresses[] and practiceLocations[] kept SEPARATE (a provider may appear in practiceLocations ONLY); NPPES exposes NO match total — full page → totalAvailable is a LOWER BOUND (totalIsLowerBound) + reach cap (limit ≤ 200, skip ≤ 1,000). Genuine {result_count:0} → honest found:false; {Errors:[…]} 200 body THROWS; 4xx/5xx/timeout THROW; count mismatch → schema_drift. ★NOT a fitness/exclusion/licensure/sanctions determination — cross-check SAM + OFAC; NPI-1 records may surface personal/home addresses + phone/fax verbatim.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Address city (a required-one criterion). e.g. 'Baltimore'. | |
| skip | No | 0-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. | |
| limit | No | Providers per page, 1..200, default 10. NPPES silently clamps >200; this tool rejects it loudly. Search mode only. | |
| state | No | US state/territory 2-letter USPS code — a REFINER only (never sufficient alone ⇒ invalid_input; NPPES rejects 'state' as the sole criterion). e.g. 'MD'. | |
| number | No | Exact 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_name | No | Individual provider last name (a required-one criterion). Trailing '*' wildcard: ≥2 leading chars. e.g. 'Smith'. | |
| first_name | No | Individual provider first name (a required-one criterion). A trailing '*' wildcard needs ≥2 leading literal chars. e.g. 'John'. | |
| postal_code | No | Address postal/ZIP code (a required-one criterion; a prefix like '212' is allowed). e.g. '21218'. | |
| enumeration_type | No | REFINER only (NPI-1 = individual, NPI-2 = organization). Never sufficient alone (⇒ invalid_input) — must accompany a required criterion. | |
| organization_name | No | Organization (NPI-2) name (a required-one criterion). Trailing '*' wildcard: ≥2 leading chars. e.g. 'Mayo Clinic'. | |
| taxonomy_description | No | Provider taxonomy/specialty description (a required-one criterion). e.g. 'Internal Medicine'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only readOnlyHint and openWorldHint; the description adds far richer behavioral detail: CMS-Luhn validation turning typos into invalid_input rather than a fake 'does not exist', co-supplied filters dropped from the wire and checked client-side (filterMatch + filtersDropped), error contract ({Errors:[...]} 200 body THROWS, 4xx/5xx/timeout THROW, count mismatch → schema_drift), and honesty guarantees (active = basic.status==='A', ms-string epochs, totalAvailable as a lower bound). 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but nearly every sentence carries a distinct behavioral fact and it is organized with scannable CAPS section markers (EXACT-NPI, SEARCH, HONESTY) plus a ★ warning. Because there is no output schema, the return-shape enumeration earns its place. Minor criticism: it reads as a dense wall of text; line breaks or bullets would improve an agent's ability to parse it under time pressure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, two-mode tool with no output schema and minimal annotations, the description is exceptionally complete: it covers purpose, mode switching, required vs refiner criteria, wildcard rules, pagination bounds, return shapes for both modes, error semantics, data honesty guarantees, and a privacy warning about NPI-1 personal addresses. The only absence is concrete rate-limit or timeout values, which is minor for a keyless read-only registry lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, yet the description supplies the cross-parameter semantics the schema cannot: the number parameter's mode-triggering behavior, the required-one vs refiner-only distinction, the trailing-'*' wildcard rule requiring ≥2 leading literal chars, and the hard caps (limit ≤ 200 with NPPES silent clamping, skip ≤ 1,000 with skip > 1000 ⇒ invalid_input). This interaction-level meaning materially exceeds per-field documentation and is essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource statement — 'Keyless CMS/HHS NPPES NPI Registry — every US healthcare provider (NPI-1 individual + NPI-2 organization)' — and immediately frames its scope against comparable sibling tools (provider registry lookup, not SAM entity lookup, not CMS revoked-provider screening). The two-mode design (EXACT-NPI vs SEARCH) is given distinct trigger conditions, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit mode-selection rules ('EXACT-NPI mode (when `number` supplied)' vs 'SEARCH mode: required-one of {first_name, last_name, organization_name, taxonomy_description, city, postal_code}'), refiner-only constraints for state/enumeration_type, and pagination caps. It also states a when-not: '★NOT a fitness/exclusion/licensure/sanctions determination — cross-check SAM + OFAC.' The only gap is that alternatives are named by data source rather than concrete sibling tool names, leaving the agent to infer which sibling maps to SAM/OFAC.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nsf_get_awardARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| awardId | Yes | NSF 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
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.
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.
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.
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.
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.
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_awardsARead-only
Search awarded NSF research-grant awards (keyless; api.nsf.gov/services/v1/awards.json), joinable to SAM/USAspending via ueiNumber/parentUeiNumber. Filters: keyword (MULTI-WORD is OR-tokenized — 'machine learning' = machine OR learning, disclosed), awardeeStateCode (UPPERCASE 2-letter USPS — non-state typo silently returns 0), awardeeName, ueiNumber (12-char UEI — EXACT SAM/USAspending join), parentUeiNumber, pdPIName, dateStart/dateEnd (strict mm/dd/yyyy — wrong format silently mis-parsed), limit (1..100), offset (0..9999). Returns { awards:[{ id, title, agency, cfdaNumber, transType, awardee:{name, city, stateCode, ueiNumber, parentUeiNumber}, principalInvestigator, 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 SAM/USAspending but the award nature differs — disclosed every response). totalAvailable = EXACT metadata.totalCount below 10,000; SATURATES at 10,000 (ES track_total_hits cap → totalIsLowerBound:true + note; first 10,000 only retrievable). NSF caps retrieval at offset+rpp ≤ 10,000 (offset ≥ 10,000 → invalid_input). fundsObligatedAmt/estimatedTotalAmt: STRINGS → number|null (genuine $0 is 0, absent is null). Genuine totalCount:0 → complete:true/total:0; serviceNotification at HTTP 200 → THROWS; outage/5xx THROWS; 200 not {response:{award,metadata}} or non-numeric totalCount → schema_drift.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Awards 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). | |
| offset | No | 0-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. | |
| dateEnd | No | Award ACTION-date upper bound. STRICT mm/dd/yyyy (same semantics/foot-gun as dateStart). e.g. '12/31/2024'. | |
| keyword | No | Free-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. | |
| pdPIName | No | Principal-investigator name filter (2..120 chars). LIVE-CONFIRMED to narrow. e.g. 'Bell'. | |
| dateStart | No | Award 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'. | |
| ueiNumber | No | Awardee 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). | |
| awardeeName | No | Awardee-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). | |
| parentUeiNumber | No | Parent-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'. | |
| awardeeStateCode | No | Awardee-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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint annotations already covering safety and openness, the description goes far beyond them: it discloses silent date mis-parsing, OR-tokenization of multi-word keywords, saturation at 10,000 with totalIsLowerBound, offset hard-cap, string-to-number coercion, error throwing on serviceNotification/5xx, and schema_drift detection. This is the model of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is tightly organized into Filters, Returns, and HONESTY sections with every sentence carrying operational value. The most critical behavioral caveats are front-loaded and scannable, making the length appropriate for a 10-parameter tool with multiple silent-failure footguns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for invoking and interpreting results: it specifies the return shape, field semantics, saturation behavior, join semantics, error conditions, and alternative-tool routing. Even without an output schema, an agent has everything needed to call correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100% and the schema descriptions are already very rich, containing the OR-tokenization warning, strict date format, UEI exact-join semantics, and offset cap. The prose redistributes this information but adds little new meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb plus resource ('Search awarded NSF research-grant awards'), adds the keyless API endpoint, and explicitly contrasts with nsf_get_award ('abstract EXCLUDED — use nsf_get_award'). It leaves no ambiguity about what this tool retrieves or how it differs from its sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to use this tool versus the named alternative: use this for award search without abstracts, use nsf_get_award when abstracts are needed. It also gives practical usage constraints, such as narrowing criteria when retrieval caps at 10,000 records and using precise filters for a clean set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nws_active_alertsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| event | No | Filter by event type — case-insensitive substring, e.g. 'Flood', 'Wind', 'Winter Storm'. | |
| limit | No | Max alerts returned (default 50, max 500). | |
| state | No | 2-letter US state/territory code to scope alerts (→ NWS ?area=), e.g. 'CA'. Omit for all active US alerts. | |
| offset | No | Zero-based page offset (default 0). | |
| severity | No | Filter by severity (exact): Extreme | Severe | Moderate | Minor | Unknown. |
TDQS
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.
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.
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.
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.
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.
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_entityARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| list | No | Which 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). | |
| name | Yes | REQUIRED. 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. | |
| type | No | Optional 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. | |
| limit | No | Max matches returned (default 50, max 200). Over-limit truncation is disclosed, never silent. | |
| program | No | Optional 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). | |
| minMatchQuality | No | Floor 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
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.
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.
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.
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.
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.
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.
open_checkbook_searchARead-only
Row-level vendor-payment search over a curated US-government Socrata Open Expenditures checkbook portal (keyless) — a SLED spending source. Some govs run Socrata's 'Open Expenditures/Open Checkbook' product, whose public dashboard fronts a keyless app-proxy at {host}/api/checkbook_data.json. First portal: sd = State of South Dakota Open Checkbook (~740,980 vendor-payment rows, ~$8.41B, the ~3 most-recent fiscal years). Inputs: portal (allowlist ENUM — SSRF core), year/vendor/org/expenseCategory (EXACT-match filters), sortBy/sortOrder, limit(1..1000)/offset. Returns { portal, rows:[{vendor, amount, payment_date, org1, expense_category, description, fund, invoice, payment_id}] } + honest _meta. HONESTY: totalAvailable = the API's own count (the REAL filtered total — matches the product's totals.json, e.g. 740,980 unfiltered / 109,887 for org=TRANSPORTATION — NEVER a page length); amount = number|null (a real $0 is 0, an absent value is null, never a fabricated 0); an EXACT-match filter miss ⇒ honest count:0; a deep offset past the end ⇒ returned:0 with the real count preserved; a 429/5xx/timeout THROWS; a non-{data:[],count} body ⇒ schema_drift. ★Only the ~3 most-recent fiscal years are exposed (NOT full history — disclosed). ★The underlying Socrata SODA dataset is login-gated and is NEVER touched — only the public app-proxy the dashboard itself uses. SSRF: fixed allowlist host + assertion + redirect:error.
| Name | Required | Description | Default |
|---|---|---|---|
| org | No | Department filter (org1, EXACT match, e.g. 'TRANSPORTATION' → 109,887). | |
| year | No | Fiscal-year filter (EXACT match), e.g. '2025'. Default 'All Years' = the exposed ~3-year window (NOT full history). | |
| limit | No | Rows per page, 1..1000, default 25. | |
| offset | No | 0-based offset (snapped to a page×limit boundary; the served offset is disclosed). totalAvailable = the real match count, NOT a page length. | |
| portal | Yes | The curated Open-Checkbook portal (SSRF allowlist enum). 'sd' = State of South Dakota Open Checkbook (~740,980 vendor payments, ~$8.41B, ~3 most-recent fiscal years). | |
| sortBy | No | Sort field. Pair with sortOrder. | |
| vendor | No | Vendor name filter (EXACT match, e.g. 'US BANK NA' → 917). A partial/misspelled value returns an honest count:0. | |
| sortOrder | No | Sort direction (default desc when sortBy is set). | |
| expenseCategory | No | Expense-category filter (EXACT match, e.g. 'CONTRACTUAL SERVICES'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Exceeds annotations by detailing honesty contracts (exact-match count, null amounts, offset behavior), SSRF protection, schema drift handling, and data recency (only 3 fiscal years). No contradictions with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense but structured with bullet points. Could be slightly tighter but front-loads purpose and key details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers input/output format, corner cases (misses, deep offsets), error handling (429/5xx), and data limitations. No output schema, but description compensates with return structure and honesty notes. Complete for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and description adds meaning for each parameter: exact-match behavior, example values, portal allowlist, page snapping, and default behaviors. Adds value beyond schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool is a row-level vendor-payment search for Socrata Open Checkbook portals, specifically the State of South Dakota example. Distinct from siblings which cover other data sources (USASpending, SAM, etc.) — unique verb+resource combination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage for finding vendor payments from state checkbook portals, with explicit example (SD). No exclusions but context suggests it's for SLED spending data. Lacks explicit 'use when' vs alternatives like socrata_query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfda_device_clearancesARead-only
Search openFDA 510(k) DEVICE CLEARANCES — FDA premarket-notification 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 (optional free OPENFDA_API_KEY only raises the rate limit — keyless works at ~1000 requests/day; NEVER throws for a missing key). Input: STRUCTURED filters — applicant, deviceName, productCode, clearanceType (e.g. Traditional/Special/Abbreviated), kNumber (e.g. 'K123456'), state (2-letter) — safely escaped into the openFDA search= Lucene string (NO raw passthrough), 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 is null-never-empty-string; decision_date is a YYYY-MM-DD string. ★A no-match query returns openFDA HTTP 404 → HONEST EMPTY (returned:0/total:0), NOT an error; 400 → invalid_input surfacing openFDA's message; 5xx → THROWS; 200 non-JSON → schema_drift. Optional key rides ONLY in &api_key= param.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| limit | No | Max clearance records to return (default 25, max 100). Offset-paginated via skip. | |
| state | No | 2-letter US state/territory postal code filter (→ state), e.g. 'CA'. Validated ^[A-Za-z]{2}$. | |
| kNumber | No | 510(k) clearance number (K-number) filter (→ k_number), e.g. 'K123456'. Matched as an escaped Lucene phrase. | |
| applicant | No | Applicant / manufacturer name filter (→ applicant), e.g. 'medtronic'. Matched as an escaped Lucene phrase. | |
| deviceName | No | Device name filter (→ device_name), e.g. 'catheter'. Matched as an escaped Lucene phrase. | |
| productCode | No | FDA product code filter (→ product_code), e.g. 'DXN'. Matched as an escaped Lucene phrase. | |
| clearanceType | No | 510(k) clearance type filter (→ clearance_type), e.g. 'Traditional', 'Special', 'Abbreviated'. Matched as an escaped Lucene phrase. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint/openWorldHint annotations, disclosing exact semantics for totalAvailable, hasMore/nextOffset pagination, null handling, date formatting, and mappings of openFDA HTTP errors to honest empty, invalid_input, throws, and schema_drift. It also specifies where the API key rides. This is rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though long, every sentence carries distinct information: purpose, endpoint, parameters, return shape, and error behavior. It is front-loaded with the core function and endpoint, uses organized sections, and avoids repetition. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies a full return structure (clearances array and _meta with pagination) and maps each parameter to its query field. It covers error handling, pagination, key usage, and validation. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover all 8 parameters (100% coverage), so the baseline is 3. The description adds value with concrete examples for each filter (e.g. 'K123456', 'DXN', 'Traditional/Special/Abbreviated') and clarifies the safe Lucene escaping behavior and pagination semantics, which are not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb ('Search openFDA 510(k) DEVICE CLEARANCES') and names the resource, fields, and endpoint. It clearly distinguishes this from sibling FDA tools (openfda_drug_approvals, openfda_enforcement) by domain and data layout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is unambiguous about what it does and includes operational notes (keyless mode, rate limits, API key behavior), giving clear context for when to call it. However, it never explicitly names sibling alternatives or states exclusions, so an agent must infer the boundary from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfda_drug_approvalsARead-only
Search openFDA Drugs@FDA DRUG APPROVALS — FDA-approved drug applications (NDA/ANDA/BLA) with the sponsor, application number, approved products (brand + generic/active-ingredient name, dosage form, route, marketing status), and submission/approval history (openFDA /drug/drugsfda.json; api.fda.gov). KEYLESS (optional free OPENFDA_API_KEY only raises the rate limit — ~1000 req/day keyless; NEVER throws for a missing key). Input: STRUCTURED filters — sponsorName, brandName, activeIngredient, applicationNumber — safely escaped into the openFDA search= Lucene string (NO raw passthrough), 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 → HONEST EMPTY (returned:0/total:0), NOT an error; 400 → invalid_input; 5xx → THROWS; 200 non-JSON → schema_drift. Optional key rides ONLY in &api_key= param.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| limit | No | Max application records to return (default 25, max 100). Offset-paginated via skip. | |
| brandName | No | Product brand name (→ products.brand_name), e.g. 'lipitor'. Matched as an escaped Lucene phrase. | |
| sponsorName | No | Sponsor / applicant company name (→ sponsor_name), e.g. 'pfizer'. Matched as an escaped Lucene phrase. | |
| activeIngredient | No | Active ingredient name (→ products.active_ingredients.name), e.g. 'atorvastatin calcium'. Matched as an escaped Lucene phrase. | |
| applicationNumber | No | FDA application number (→ application_number), e.g. 'NDA050347'. Matched as an escaped Lucene phrase. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description fully discloses error handling (404 → empty, 400 → invalid_input, 5xx → throws, 200 non-JSON → schema_drift), honesty about totalAvailable (exact meta.results.total), null-never-empty-string convention, and the distinction between 'Discontinued' and revocation. This is far more than annotations provide and sets clear expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but every sentence carries unique value: purpose, endpoint, keyless behavior, filter semantics, output structure, honesty rules, and error mapping. It is not concise in the traditional sense, but it is packed with necessary information. It earns a 4 because it could be slightly tighter while preserving all crucial details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and rich behavior, the description covers the complete return object structure, pagination semantics, error mapping, and key edge cases (e.g., no-match 404 returns empty, not error). Nothing an agent needs to call it correctly and interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema descriptions are 100% and each parameter is described, the tool description adds crucial meaning: filters are 'STRUCTURED filters' that are 'safely escaped into the openFDA search= Lucene string (NO raw passthrough)', and pagination with limit/skip is explained. This enriches the agent's understanding of how parameters behave and are used in queries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Search openFDA Drugs@FDA DRUG APPROVALS — FDA-approved drug applications (NDA/ANDA/BLA)...' and enumerates the exact data fields and endpoint. It clearly distinguishes this tool from siblings like openfda_enforcement or openfda_device_clearances by naming 'DRUG APPROVALS' and providing the specific /drug/drugsfda.json endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use this tool — for drug approval lookups — and also provides usage guidance about the optional API key and pagination (skip/limit). It does not explicitly contrast with alternative openFDA tools, but the naming and scope make the intended use obvious. The keyless behavior ('NEVER throws for a missing key') is a useful practical guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openfda_enforcementARead-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 (api.fda.gov/{category}/enforcement.json). KEYLESS — an OPTIONAL free OPENFDA_API_KEY only raises the rate limit; keyless works at ~1000 requests/day and NEVER throws for a missing key. Input: category (drug|device|food, default drug), structured filters — firm (→recalling_firm), product (→product_description), reason (→reason_for_recall), classification (Class I|II|III), status (e.g. Ongoing/Terminated), state (2-letter) — safely assembled + escaped into openFDA search= Lucene string (NO raw passthrough), plus limit (1..100, def 25) and skip. 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 (recall_initiation_date is a YYYYMMDD string) is null-never-empty-string. ★A no-match query returns openFDA HTTP 404 NOT_FOUND → HONEST EMPTY (returned:0, totalAvailable:0), NOT an error; 400 → invalid_input surfacing openFDA's message; 5xx → THROWS; 200 non-JSON → schema_drift. Optional key rides ONLY the &api_key= query param.
| Name | Required | Description | Default |
|---|---|---|---|
| firm | No | Recalling firm name filter (→ recalling_firm), e.g. 'pfizer'. Matched as an escaped Lucene phrase. | |
| skip | No | Row offset for pagination (default 0). Page with _meta.pagination.nextOffset. | |
| limit | No | Max recall records to return (default 25, max 100). Offset-paginated via skip. | |
| state | No | 2-letter US state/territory postal code filter (→ state), e.g. 'CA'. Validated ^[A-Za-z]{2}$. | |
| reason | No | Reason-for-recall filter (→ reason_for_recall), e.g. 'contamination'. Matched as an escaped Lucene phrase. | |
| status | No | Recall status filter (→ status), e.g. 'Ongoing', 'Terminated', 'Completed'. | |
| product | No | Product description filter (→ product_description), e.g. 'insulin'. Matched as an escaped Lucene phrase. | |
| category | No | The recall category (default 'drug'): 'drug', 'device', or 'food'. Selects the openFDA /{category}/enforcement endpoint. | |
| classification | No | FDA recall classification filter: 'Class I' (most serious), 'Class II', or 'Class III'. |
TDQS
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 keyless operation with a specific rate limit (~1000 requests/day), explains that the key never causes errors, and details exact error semantics (404→honest empty, 400→invalid_input with message, 5xx→throw, 200 non-JSON→schema_drift). It also reveals return format, pagination honesty (using totalAvailable and hasMore/nextOffset), and null-handling policy (null-never-empty-string). This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured, with clear sections for purpose, keyless behavior, inputs, return format, and error handling. It front-loads the core purpose and then layers details logically. While verbose, every sentence provides actionable information; no filler. The use of bullet points and symbols (★) aids scanning. It earns a 4, slightly penalized for length that could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no output schema, the description is remarkably complete. It specifies the exact return object structure with field names, explains pagination via _meta.pagination.nextOffset, documents error mapping for every plausible HTTP status, and even notes that recall_initiation_date is a YYYYMMDD string. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 9 parameters. The description adds value beyond the schema by mapping each filter to the openFDA field name (→ recalling_firm, etc.), noting that values are escaped into a Lucene string, and clarifying the default for category and the range for limit. This goes beyond a baseline 3, though it doesn't dive into syntax details for every parameter; the schema already covers validation (e.g., state regex).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search openFDA recall/enforcement records — drug/device/food product recalls'. It lists the exact data elements returned (recalling firm, product, reason, classification, status, geography) and explicitly names the endpoint (api.fda.gov/{category}/enforcement.json). This is unambiguous and distinguishes it from sibling tools like openfda_device_clearances or nhtsa_recalls, which focus on different datasets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides extensive usage guidance: explains the optional API key behavior and rate limits, details how each filter maps to an openFDA field (e.g., firm→recalling_firm, product→product_description), explains the default category, and lays out pagination via skip/limit. It also covers error handling for common cases (404→empty, 400→invalid_input, 5xx→throws). It does not explicitly name alternative tools for different data needs, but the scope is so clearly defined that an agent can route appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opengov_list_governmentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Portals per page, 1..200, default 50. | |
| query | No | Case-insensitive name substring filter (client-side), e.g. 'county', 'school'. Optional. | |
| state | No | 2-letter US state filter (client-side), e.g. 'CA', 'FL'. Optional. | |
| offset | No | 0-based offset; page with _meta.pagination.nextOffset. totalAvailable = exact filtered portal count. |
TDQS
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.
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.
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.
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.
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.
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_solicitationsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Solicitations per page, 1..100, default 50 (→ API page size). | |
| offset | No | 0-based offset (snapped to the API's fixed page boundary). Page with _meta.pagination.nextOffset. | |
| governmentCode | Yes | The 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
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.
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.
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.
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.
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.
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_docketARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| docketId | Yes | The 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
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.
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.
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.
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.
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.
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_commentsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order (default '-postedDate'). Live-verified set: -postedDate/postedDate/-lastModifiedDate/lastModifiedDate/-commentEndDate (non-exhaustive). | |
| query | No | Alias for `searchTerm` (either is accepted; both feed filter[searchTerm]). | |
| agencyId | No | Filter by posting agency acronym (filter[agencyId]), e.g. 'EPA', 'FDA'. | |
| docketId | No | Filter by docket id (filter[docketId]), e.g. 'EPA-HQ-OAR-2021-0257'. | |
| pageSize | No | Records per page (page[size]), 5..250, default 25. | |
| pageNumber | No | 1-based page number, 1..40 (HARD cap — page[number] max is 40; the reachable window is 40×pageSize ≤ 10,000 records). | |
| searchTerm | No | Full-text search term (filter[searchTerm]), e.g. 'artificial intelligence'. | |
| documentType | No | Filter by document type (documents only): Rule / Proposed Rule / Notice / Supporting & Related Material / Other. | |
| postedDateGe | No | Posted on/after this date, YYYY-MM-DD (filter[postedDate][ge]). | |
| postedDateLe | No | Posted on/before this date, YYYY-MM-DD (filter[postedDate][le]). | |
| withinCommentPeriod | No | true ⇒ only documents currently open for comment (documents only; filter[withinCommentPeriod]). |
TDQS
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.
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.
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.
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.
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.
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_docketsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order (default '-lastModifiedDate'). Set: -lastModifiedDate/lastModifiedDate/title/-title (first two DEMO_KEY-verified). | |
| limit | No | Requested 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. | |
| query | No | Alias for `searchTerm` (either is accepted; both feed filter[searchTerm]). | |
| agencyId | No | Filter by owning agency acronym (filter[agencyId]), e.g. 'EPA', 'BLM', 'TREAS-FINCEN'. | |
| docketType | No | Filter by docket type: Rulemaking / Nonrulemaking (filter[docketType]). | |
| pageNumber | No | 1-based page number, 1..40 (HARD cap — page[number] max is 40; the reachable window is 40×page[size] ≤ 10,000 records). | |
| searchTerm | No | Full-text search term (filter[searchTerm]) over docket title/abstract, e.g. 'endangered species'. | |
| lastModifiedDateGe | No | Docket last modified on/after this date, YYYY-MM-DD (filter[lastModifiedDate][ge]). | |
| lastModifiedDateLe | No | Docket last modified on/before this date, YYYY-MM-DD (filter[lastModifiedDate][le]). |
TDQS
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.
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.
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.
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.
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.
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_documentsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order (default '-postedDate'). Live-verified set: -postedDate/postedDate/-lastModifiedDate/lastModifiedDate/-commentEndDate (non-exhaustive). | |
| query | No | Alias for `searchTerm` (either is accepted; both feed filter[searchTerm]). | |
| agencyId | No | Filter by posting agency acronym (filter[agencyId]), e.g. 'EPA', 'FDA'. | |
| docketId | No | Filter by docket id (filter[docketId]), e.g. 'EPA-HQ-OAR-2021-0257'. | |
| pageSize | No | Records per page (page[size]), 5..250, default 25. | |
| pageNumber | No | 1-based page number, 1..40 (HARD cap — page[number] max is 40; the reachable window is 40×pageSize ≤ 10,000 records). | |
| searchTerm | No | Full-text search term (filter[searchTerm]), e.g. 'artificial intelligence'. | |
| documentType | No | Filter by document type (documents only): Rule / Proposed Rule / Notice / Supporting & Related Material / Other. | |
| postedDateGe | No | Posted on/after this date, YYYY-MM-DD (filter[postedDate][ge]). | |
| postedDateLe | No | Posted on/before this date, YYYY-MM-DD (filter[postedDate][le]). | |
| withinCommentPeriod | No | true ⇒ only documents currently open for comment (documents only; filter[withinCommentPeriod]). |
TDQS
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.
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.
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.
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.
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.
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_urlARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | Yes | Resource id from sam_get_opportunity → resourceLinks (URL-tail hex) |
TDQS
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.
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.
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.
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.
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.
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_exclusionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| uei | No | SAM UEI to match. Used as the text query when it is the sole selector; post-filtered against results when combined with a name query. | |
| cage | No | CAGE code to match (post-filtered against results, or used as the text query when sole). | |
| page | No | 0-based page index (default 0). | |
| size | No | Page size (default 25, max 100). | |
| query | No | Firm or individual name to screen (drives the server-side exclusions text search). Provide at least one of query/uei/cage. | |
| activeOnly | No | Only currently-active exclusions (default true). false includes terminated exclusions. | |
| classification | No | Filter by excluded-party classification (default 'any'). |
TDQS
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.
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.
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.
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.
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.
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_textARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | SAM 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. | |
| maxChars | No | Cap on returned text characters (default 200000, max 500000). Truncation is disclosed in _meta (truncated:true). |
TDQS
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.
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.
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.
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.
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.
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_descriptionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| noticeId | Yes | 32-char hex notice id |
TDQS
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.
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.
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.
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.
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.
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_opportunityARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| noticeId | Yes | 32-char hex notice id |
TDQS
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.
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.
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.
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.
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.
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_ratesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | 'parsed' (structured rates, default), 'raw' (the full document text), or 'both'. Use 'raw'/'both' when parseConfidence is low. | |
| coverage | No | Optional hint (sca|dba) to disambiguate the parser; inferred otherwise. | |
| revision | No | Revision number. Omit to resolve the latest ACTIVE revision via /history. | |
| reference | Yes | fullReferenceNumber of the wage determination (e.g. '2015-4093' for SCA, 'IA20260028' for DBA) from sam_search_wage_determinations. |
TDQS
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.
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.
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.
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.
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.
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_lookupARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| uei | No | SAM UEI of the entity to screen (PREFERRED — most precise). Provide at least one of uei/cage/name. | |
| cage | No | CAGE code of the entity to screen. | |
| name | No | Legal entity name to screen (drives the keyless exclusions text search; normalized-name gated). Provide at least one of uei/cage/name. |
TDQS
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.
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.
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.
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.
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.
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_fieldsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| noticeIds | Yes | 1..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
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.
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.
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.
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.
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.
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_organizationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| organizationId | Yes | SAM.gov federal-organization id (numeric) |
TDQS
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.
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.
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.
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.
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.
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_opportunitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| ncode | No | NAICS code, e.g. '541512' | |
| query | No | Free-text title query | |
| state | No | Place-of-performance state, 2-letter, e.g. 'MD' | |
| offset | No | Page offset into the result set (default 0). | |
| setAside | No | Set-aside codes: SBA, 8A, HZS, SDVOSBC, WOSB, EDWOSB, VSA, VSS | |
| organizationName | No | Issuing agency canonical name (e.g. 'Department of Veterans Affairs'). Use sam_lookup_organization or usas_lookup_agency to resolve abbreviations. |
TDQS
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.
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.
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.
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.
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.
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_shapingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 25, max 50). | |
| ncode | No | NAICS code, e.g. '541512' | |
| query | No | Free-text title query | |
| state | No | Place-of-performance state, 2-letter, e.g. 'MD' | |
| setAside | No | Set-aside codes: SBA, 8A, HZS, SDVOSBC, WOSB, EDWOSB, VSA, VSS | |
| activeOnly | No | Only currently-active notices (default true). | |
| noticeType | No | Pre-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. | |
| organizationName | No | Issuing 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`. | |
| responseDeadlineTo | No | ISO date upper bound for responseDeadline. APPLIED CLIENT-SIDE over the fetched page (see responseDeadlineFrom). | |
| responseDeadlineFrom | No | ISO 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
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.
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.
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.
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.
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.
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_determinationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 0-based page index (default 0). | |
| limit | No | Page size (default 20, max 50). | |
| query | No | Matches the WD NUMBER/TITLE only — NOT occupation/job title (q=guard returns 0). | |
| state | No | 2-letter USPS state code (e.g. 'VA'), applied SERVER-SIDE. A full name is applied client-side instead. | |
| county | No | County name (substring match), applied CLIENT-SIDE over the fetched page only (the API has no county filter). | |
| coverage | Yes | Which wage-determination law: 'sca' (Service Contract Act — services) or 'dba' (Davis-Bacon Act — construction). 'dba' is normalized to the API's 'dbra' index. | |
| activeOnly | No | Only currently-active WDs (default true). | |
| standardOnly | No | Only standard (non-non-standard) WDs (default true). |
TDQS
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.
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.
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.
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.
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.
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_standardARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| naics | Yes | 6-digit NAICS code to look up the SBA small-business size standard for (e.g. '541512'). |
TDQS
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.
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.
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.
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.
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.
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_domainsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City — case-insensitive SUBSTRING match. | |
| limit | No | Rows per page, 1..500, default 50. | |
| scope | No | 'all' (federal + SLED: state/county/city/school-district/special-district/tribal, ~16k rows, DEFAULT) or 'federal' (federal-only, ~1.3k rows). | |
| state | No | 2-letter state/territory code — case-insensitive exact match (e.g. 'CA'). | |
| domain | No | Domain name — case-insensitive SUBSTRING match (e.g. 'cdc.gov', 'irs'). | |
| offset | No | 0-based row offset for pagination, default 0. | |
| domainType | No | Domain type — case-insensitive match (e.g. 'Federal - Executive', 'County', 'Tribal', 'State or territory', 'School district'). | |
| organization | No | Organization name — case-insensitive SUBSTRING match (e.g. 'veterans', 'cybersecurity'). |
TDQS
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.
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.
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.
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.
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.
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_datasetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Keyword(s) to find datasets, e.g. 'procurement', 'vendor payments', 'checkbook'. | |
| limit | No | Max datasets to return, 1..100, default 20. | |
| domain | No | Optional: 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
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.
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.
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.
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.
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.
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_queryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Optional SoQL $q full-text search across the row. | |
| limit | No | Rows per page ($limit), 1..1000, default 100. | |
| order | No | Optional SoQL $order, e.g. 'amount DESC'. | |
| where | No | Optional SoQL $where filter, e.g. "fiscal_year='2024' AND amount>1000". A bad column ⇒ upstream HTTP 400 ⇒ invalid_input (surfaced, never silent). | |
| domain | Yes | Which 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. | |
| offset | No | 0-based row offset ($offset) for pagination, default 0. | |
| select | No | Optional SoQL $select (column projection / aggregate), e.g. 'agency,SUM(amount)'. | |
| datasetId | Yes | The 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). | |
| withTotal | No | true (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
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.
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.
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.
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.
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.
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_csvARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | Yes | The 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). | |
| limit | No | Rows per page, 1..1000, default 50. The CSV is the complete view export; this pages over it client-side. | |
| offset | No | 0-based offset; page with _meta.pagination.nextOffset. totalAvailable = the complete export row count (NOT a page length). |
TDQS
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.
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.
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.
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.
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.
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_ratesARead-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').
| Name | Required | Description | Default |
|---|---|---|---|
| latest | No | true (default) ⇒ the most-recent month's full breakdown across security types (pinned to the latest record_date, memoized). false ⇒ the startDate/endDate range. | |
| endDate | No | Range mode only: ISO YYYY-MM-DD upper bound on record_date (inclusive). | |
| pageSize | No | Range mode: rows per page, 1..500, default 100. | |
| startDate | No | Range mode only: ISO YYYY-MM-DD lower bound on record_date (inclusive). | |
| pageNumber | No | Range mode: 1-based page number, default 1. | |
| securityType | No | Optional exact security_type_desc filter (e.g. 'Marketable', 'Non-marketable', 'Interest-bearing Debt'). |
TDQS
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.
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.
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.
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.
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.
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_pennyARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| latest | No | true (default) ⇒ only the single most-recent day (page[size]=1). false ⇒ the startDate/endDate range, newest-first. | |
| endDate | No | Range mode only: ISO YYYY-MM-DD upper bound on record_date (inclusive). | |
| pageSize | No | Range mode: rows per page, 1..500, default 100. | |
| startDate | No | Range mode only: ISO YYYY-MM-DD lower bound on record_date (inclusive). | |
| pageNumber | No | Range mode: 1-based page number, default 1. |
TDQS
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.
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.
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.
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.
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.
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_statementARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | ISO YYYY-MM-DD upper bound on record_date (inclusive). | |
| pageSize | No | Rows per page, 1..500, default 100. | |
| startDate | No | ISO YYYY-MM-DD lower bound on record_date (inclusive). Default: trailing ~12 months. | |
| pageNumber | No | 1-based page number, default 1. | |
| excludeSummaryRows | No | true (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
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.
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.
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.
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.
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.
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_datasetARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Optional CSV sort columns; prefix '-' for descending (e.g. '-record_date'). | |
| fields | No | Optional CSV column projection (e.g. 'record_date,exchange_rate'). An unknown column ⇒ upstream HTTP 400 ⇒ invalid_input (surfaced as an error, never silently dropped). | |
| filter | No | Optional 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'. | |
| dataset | Yes | Which 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). | |
| pageSize | No | Rows per page (upstream page[size]); 1..500, default 100. | |
| pageNumber | No | 1-based page number (upstream page[number]); default 1. |
TDQS
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.
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.
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.
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.
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.
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_incumbentARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| otherAwardsLimit | No | Cap on incumbentOtherAwards (default 15, max 50). | |
| includeOtherAwards | No | Also return the incumbent's other awards in the same agency×NAICS via one bounded recipient search (default true). | |
| generatedInternalId | Yes | The ONE award to analyze — generatedInternalId from usas_search_individual_awards / usas_search_awards_by_recipient / usas_search_recompetes (e.g. CONT_AWD_*). |
TDQS
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.
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.
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.
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.
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.
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_naicsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| searchText | Yes |
TDQS
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.
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.
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.
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.
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.
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_recipientARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| searchText | Yes |
TDQS
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.
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.
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.
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.
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.
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_spendingARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| defCodes | Yes | Disaster 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. | |
| geoLayer | No | Geographic breakout: state (default), county, or congressional district. | |
| spendingType | No | obligation (default) or outlay. Some DEFCs report $0 obligations but real outlays — try both. |
TDQS
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.
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.
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.
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.
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.
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_summaryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| fiscalYear | No | ||
| toptierCode | Yes | 3-4 digit toptier code from usas_lookup_agency (e.g. '036' for VA) |
TDQS
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.
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.
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.
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.
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.
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_functionARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| fiscalYear | No | ||
| toptierCode | Yes | 3-4 digit toptier code from usas_lookup_agency (e.g. '036' for VA) |
TDQS
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.
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.
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.
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.
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.
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_profileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| toptierCode | Yes | 3-4 digit toptier code from usas_lookup_agency (e.g. '036' for VA) |
TDQS
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.
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.
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.
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.
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.
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_detailARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| generatedInternalId | Yes | From spending_by_award results — e.g. CONT_AWD_* |
TDQS
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.
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.
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.
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.
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.
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_profileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| recipientId | Yes | From usas_search_recipients — e.g. 'ed02855e-...-P' |
TDQS
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.
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.
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.
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.
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.
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_glossaryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No |
TDQS
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.
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.
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.
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.
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.
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_codesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_agenciesARead-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_*.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
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.
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.
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.
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.
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.
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_agencyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| searchText | Yes | Agency name or abbreviation |
TDQS
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.
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.
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.
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.
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.
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_hierarchyARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| naicsFilter | No | Filter to a specific NAICS code subtree, e.g. '541512' |
TDQS
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.
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.
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.
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.
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.
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_spendingARead-only
Spending broken down by awarding agency. Use for 'which agencies spend the most on NAICS 541512' — top buyers by $.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| setAside | No | ||
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_awardsARead-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?').
| Name | Required | Description | Default |
|---|---|---|---|
| naics | No | ||
| agency | No | Canonical agency name | |
| setAside | No | ||
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_recipientARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| agency | No | ||
| fiscalYear | No | ||
| recipientName | Yes |
TDQS
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.
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.
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.
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.
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.
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_spendingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| agency | No | 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. | |
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_contractsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| agency | No | ||
| minAwardValue | No | ||
| monthsUntilExpiry | No |
TDQS
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.
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.
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.
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.
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.
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_spendingBRead-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').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| agency | No | 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. | |
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_awardsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| agency | No | Canonical agency name | |
| setAside | No | ||
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_spendingARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| agency | No | 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. | |
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_recipientsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| keyword | Yes | ||
| recipientLevel | No | P=parent, C=child, R=recipient |
TDQS
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.
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.
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.
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.
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.
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_recompetesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page (default 1). | |
| naics | No | 6-digit NAICS code, e.g. '541512' | |
| agency | No | Canonical awarding toptier agency name (use usas_lookup_agency) | |
| pageSize | No | Rows per page (default 25, max 100). | |
| pscCodes | No | Product/Service Codes to filter on, e.g. ['DA01','R425'] | |
| setAside | No | USAspending set_aside_type_code (honored server-side) | |
| minAwardValue | No | Minimum Award Amount ($) to include (default 0). | |
| windowEndDays | No | Upper edge of the window in days from today (default 548 ≈ 18 months). | |
| scanBudgetPages | No | Max 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. | |
| windowStartDays | No | Lower edge of the recompete window in days from today (default -90 = include contracts that ended up to 90 days ago). | |
| includePotentialEnd | No | Also return the potential (option-inclusive) PoP end date + extendableDays (default false). | |
| actionDateLookbackYears | No | action_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
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.
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.
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.
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.
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.
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_spendingARead-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'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| agency | No | 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. | |
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_spendingARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| agency | Yes | 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. | |
| fiscalYear | No |
TDQS
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.
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.
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.
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.
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.
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_subawardsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| naics | No | ||
| agency | No | ||
| fiscalYear | No | ||
| subRecipientName | No |
TDQS
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.
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.
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.
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.
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.
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_partnersARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| cert | Yes | Socioeconomic 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). | |
| page | No | 1-based page index (default 1). | |
| limit | No | Candidates per page (default 25, max 50). | |
| naics | No | NAICS code to scope the search (e.g. '541512'). | |
| agency | No | Awarding agency canonical toptier name (e.g. 'Department of Veterans Affairs'). Use usas_lookup_agency to resolve abbreviations. | |
| minAwards | No | Minimum scanned award count for a firm to be listed (default 1). | |
| scanPages | No | Award-value-sorted pages (100 rows each) to scan before aggregating by recipient (default 4, max 10). | |
| screenCap | No | Max candidates to exclusion-screen per page (default 10, max 25). | |
| subagency | No | Awarding sub-agency name. Requires `agency` to also be set (a subagency alone is dropped). | |
| lookbackYears | No | Action-date lookback window in years (default 3). | |
| excludeDebarred | No | Screen the top-ranked candidates via sam_check_exclusions and drop active exclusions (default true; bounded + disclosed in _meta). |
TDQS
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.
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.
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.
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.
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.
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_timeARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| naics | No | ||
| agency | No | ||
| setAside | No |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v1.14.0- Changed
arcgis_feature_query1 field changed- changed
Input schema / properties / service / descriptionPrevious value: -"The 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), 'nddot_flex_setaside_road'/'nddot_flex_partner_road'/'nddot_flex_setaside_bridge'/'nddot_flex_partner_bridge' (North Dakota DOT federal flex-funding awards to local public agencies — counties/townships/cities, NOT vendor contracts; a proxy because ND's checkbook/procurement portal is not keyless-reachable). 27 curated services (state DOT bid/award registers: TX/AK/IA/OK + ND DOT flex-funding awards + municipal checkbooks/contracts)."New value: +"Service key (SSRF allowlist; 27 services). DC OCP PASS (solicitations/contracts/purchase_orders/payments). US local govs: Asheville NC, Bellevue WA, Miami-Dade FL×2, Suffolk County NY, Mat-Su AK, Las Vegas NV×2, Baltimore MD, Naperville IL, Worcester MA, Topeka KS (FY2015–23); TX/AK/IA/OK DOT bid/award registers. ND DOT flex-funding to local agencies (nddot_flex×4 — NOT vendor contracts)."
- Changed
bls_timeseries1 field changed- changed
Input schema / properties / seriesId / descriptionPrevious value: -"One 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."New value: +"One 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,25}$ (uppercase alnum; punctuation/whitespace/lowercase rejected — SSRF + 'verify the ID' honesty). OEWS IDs are 25 chars (e.g. OEUN000000000000015125201). 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."
- Changed
lda_search_filings1 field changed- changed
Input schema / properties / agency / descriptionPrevious value: -"NOTE: 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."New value: +"NOTE: /filings/ has NO server-side government-entity filter — the LDA API silently ignores this field (reported in _meta.filtersDropped, never as a narrowed total). Government entities are nested per activity in lobbyingActivities[].governmentEntities; narrow by registrantName/clientName/issue and inspect those nested entities. Retained for discoverability."
2 tool updates
v1.13.1- Changed
arcgis_feature_query1 field changed- changed
Input schema / properties / service / descriptionPrevious value: -"The 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)."New value: +"The 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), 'nddot_flex_setaside_road'/'nddot_flex_partner_road'/'nddot_flex_setaside_bridge'/'nddot_flex_partner_bridge' (North Dakota DOT federal flex-funding awards to local public agencies — counties/townships/cities, NOT vendor contracts; a proxy because ND's checkbook/procurement portal is not keyless-reachable). 27 curated services (state DOT bid/award registers: TX/AK/IA/OK + ND DOT flex-funding awards + municipal checkbooks/contracts)."
- Changed
echo_facility_report1 field changed- changed
Input schema / properties / registryId / descriptionPrevious value: -"The 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)."New value: +"The facility's RegistryID exactly as returned in echo_search_facilities rows — usually a 12-digit FRS id (e.g. '110059768461'), but ECHO also returns state/program ids (e.g. 'DCR000509282') and short ids (e.g. '9434'), which the report accepts. 1–20 letters/digits. A bad/unknown id ⇒ not_found (never a fabricated report)."
124 tool updates
v1.12.0- Added
api_key_status - Added
arcgis_feature_query - Added
arcgis_hub_discover_datasets - Added
bea_regional_data - Added
bls_oews_wages - Added
bls_qcew - Added
bls_timeseries - Added
bonfire_list_organizations - Added
bonfire_search_opportunities - Added
cbp_border_wait_times - Added
census_business_patterns - Added
census_geocode_address - Added
census_geographies_by_coordinates - Added
cisa_kev_lookup - Added
ckan_discover_datasets - Added
ckan_query - Added
clinicaltrials_facet_counts - Added
clinicaltrials_get_study - Added
clinicaltrials_search_studies - Added
cms_dmepos_suppliers - Added
cms_facility_directory - Added
cms_hospital_compare - Added
cms_medicare_provider_services - Added
cms_query_dataset - Added
cms_revoked_providers - Added
cms_search_datasets - Added
congress_get_bill - Added
congress_search_bills - Added
courtlistener_search_opinions - Added
cpsc_recalls - Added
cve_lookup - Added
datagov_search_datasets - Added
dol_get_dataset - Added
dol_list_datasets - Added
ecfr_get_section - Added
echo_facility_report - Added
echo_search_facilities - Added
edgar_company_concept - Added
edgar_company_facts - Added
edgar_company_filings - Added
edgar_daily_filing_index - Added
edgar_filing_index - Added
edgar_full_text_search - Added
edgar_lookup_cik - Added
edgar_xbrl_frames - Added
epa_tri_facilities - Added
fac_get_findings - Added
fac_search_audits - Added
far_clause_lookup - Added
far_compliance_matrix - Added
far_search - Added
fdic_bank_failures - Added
fdic_branch_deposits - Added
fdic_industry_summary - Added
fdic_institution_financials - Added
fdic_institution_history - Added
fdic_risk_ratios - Added
fdic_search_institutions - Added
fed_register_public_inspection - Added
feedback - Added
fema_disaster_declarations - Added
fema_search_hazard_mitigation - Added
fema_search_public_assistance - Added
fpds_search_awards - Added
fred_search_series - Added
fred_series_observations - Added
gao_protest_lookup - Added
govinfo_get_package - Added
govinfo_list_collections - Added
govinfo_search_packages - Added
gsa_benchmark_labor_rates - Added
gsa_perdiem_rates - Added
hts_lookup - Added
lda_search_filings - Added
nhtsa_complaints - Added
nhtsa_recalls - Added
nih_reporter_search_projects - Added
nist_800_53_controls - Added
nonprofit_financials - Added
nonprofit_search - Added
nppes_lookup_provider - Added
nsf_get_award - Added
nsf_search_awards - Added
nws_active_alerts - Added
ofac_screen_entity - Added
open_checkbook_search - Added
openfda_device_clearances - Added
openfda_drug_approvals - Added
openfda_enforcement - Added
opengov_list_governments - Added
opengov_search_solicitations - Added
regulations_get_docket - Added
regulations_search_comments - Added
regulations_search_dockets - Added
regulations_search_documents - Added
sam_check_exclusions - Added
sam_fetch_attachment_text - Added
sam_get_wage_rates - Added
sam_integrity_lookup - Added
sam_lookup_notice_fields - Changed
sam_search_opportunities1 field changed- added
Input schema / properties / offsetAdded value: +{ + "description": "Page offset into the result set (default 0).", + "type": "number" +}
- Added
sam_search_shaping - Added
sam_search_wage_determinations - Added
sba_size_standard - Added
search_gov_domains - Added
socrata_discover_datasets - Added
socrata_query - Added
tableau_view_csv - Added
treasury_avg_interest_rates - Added
treasury_debt_to_penny - Added
treasury_monthly_statement - Added
treasury_query_dataset - Added
usas_analyze_incumbent - Added
usas_disaster_spending - Added
usas_list_disaster_codes - Changed
usas_search_cfda_spending1 field changed- added
Input schema / properties / agency / descriptionAdded 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."
- Changed
usas_search_expiring_contracts1 field changed- removed
Input schema / properties / fiscalYearRemoved value: -{ - "type": "number" -}
- Changed
usas_search_federal_account_spending1 field changed- added
Input schema / properties / agency / descriptionAdded 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."
- Changed
usas_search_psc_spending1 field changed- added
Input schema / properties / agency / descriptionAdded 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."
- Added
usas_search_recompetes - Changed
usas_search_state_spending1 field changed- added
Input schema / properties / agency / descriptionAdded 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."
- Changed
usas_search_subagency_spending1 field changed- added
Input schema / properties / agency / descriptionAdded 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."
- Changed
usas_search_subawards2 fields changed- removed
Input schema / properties / primeRecipientNameRemoved value: -{ - "type": "string" -} - added
Input schema / properties / subRecipientNameAdded value: +{ + "type": "string" +}
- Added
usas_search_teaming_partners
36 tool updates
v0.2.1- First observed
ecfr_list_titles - First observed
ecfr_search - First observed
fed_register_get_document - First observed
fed_register_list_agencies - First observed
fed_register_search_documents - First observed
grants_get_opportunity - First observed
grants_search - First observed
sam_attachment_url - First observed
sam_fetch_description - First observed
sam_get_opportunity - First observed
sam_lookup_organization - First observed
sam_search_opportunities - First observed
usas_autocomplete_naics - First observed
usas_autocomplete_recipient - First observed
usas_get_agency_awards_summary - First observed
usas_get_agency_budget_function - First observed
usas_get_agency_profile - First observed
usas_get_award_detail - First observed
usas_get_recipient_profile - First observed
usas_glossary - First observed
usas_list_toptier_agencies - First observed
usas_lookup_agency - First observed
usas_naics_hierarchy - First observed
usas_search_agency_spending - First observed
usas_search_awards - First observed
usas_search_awards_by_recipient - First observed
usas_search_cfda_spending - First observed
usas_search_expiring_contracts - First observed
usas_search_federal_account_spending - First observed
usas_search_individual_awards - First observed
usas_search_psc_spending - First observed
usas_search_recipients - First observed
usas_search_state_spending - First observed
usas_search_subagency_spending - First observed
usas_search_subawards - First observed
usas_spending_over_time
TDQS
Scored across 152 tools
The tools are organized by source prefix and mostly target distinct resource-action pairs, but the USAspending family has near-sibling names (search_awards vs search_individual_awards vs search_awards_by_recipient) and SAM has separate body/description/attachment fetchers. Long descriptions mitigate confusion, but the volume of overlapping search/lookup tools makes misselection a real risk.
Snake_case source_verb_noun dominates and is predictable across most families. Minor exceptions like sam_attachment_url, api_key_status, usas_glossary, and the deprecated alias usas_search_expiring_contracts are small deviations from an otherwise consistent pattern.
At 152 tools this is far beyond any ergonomic tool set; a 50+ count signals an extreme mismatch even though the server intentionally aggregates many data sources. An agent faces a huge selection surface before it can even reach the source-specific families.
The server covers an unusually broad lifecycle: discovery, detail, attachment text, wage rates, exclusions, spending rollups, and cross-source join hints. Minor gaps exist—no Regulations.gov document-detail tool, no keyed SAM entity registration search, and some declared unavailable data (CPARS, full GAO history)—but most workflows have a clear next step.
Maintenance
Related MCP Connectors
MCP access to the U.S. federal procurement graph: contracts, opportunities, entities, and more.
US government data as clean JSON for AI agents: SAM.gov contract opportunities, USAspending awards, Grants.gov grants, House STOCK Act trades, and SEC EDGAR filings (Form 4 insider trades, 8-K events, 13F holdings, 13D/G stakes, XBRL fundamentals, 10-K/10-Q sections). 19 read-only tools. Data is as fresh as each source publishes; congressional trades lag up to 45 days and report dollar ranges (House only). Free tier, no card.
Search US grants + federal contracts (Grants.gov + SAM.gov) from any LLM.
SAM.gov contract opportunities and entity lookup (BYOK) plus USASpending federal award data.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAn 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.6 npm1JavaScriptMIT

USA Spending MCP Serverofficial
FlicenseBqualityDmaintenanceAn MCP server for interacting with the USAspending.gov API, supporting local use with Claude Desktop and cloud deployment with login.gov authentication.310-- AlicenseAqualityCmaintenanceGovToolsPro 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 d1026 npm2MIT
- AlicenseAqualityBmaintenanceA 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.8Academic Free v1.1