Grants.gov MCP — open federal grant opportunities (free, no auth)
Two tools with complete input schemas and reasonable descriptions. Naming follows verb_noun convention (search_, get_). However, descriptions lack depth on WHEN to use each tool and what distinguishes them. Parameters are documented but lack constraints (enums, ranges). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal. No tool annotations (readOnlyHint, idempotentHint). search_opportunities has 7 optional params with no validation guidance; get_opportunity requires opportunity_id but no guidance on how to obtain it. Descriptions are 150-180 chars (within baseline 194 avg but generic). No mention of pagination limits or result caps.
Fetch full details for a Grants.gov opportunity by ID. Returns synopsis text, eligibility, award ceiling/floor, attachments, contact info, and version history.
Search Grants.gov for currently-open or recently-closed federal funding opportunities. Filter by keyword, opportunity status, agency code, funding category, or date range. Returns opportunity number, title, agency, open/close dates, and assistance listing numbers (formerly CFDA).
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). normalizeHit() and normalizeDetail() transform API responses but their output shape is invisible to callers.
No parameter constraints (enums, ranges, patterns). 'status' accepts 'forecasted|posted|closed|archived' but is documented as free-form string. 'limit' accepts 1-1000 but no min/max in schema. LLMs may pass invalid values.
No tool annotations. Both tools are read-only (safe to retry) but lack readOnlyHint. Agents cannot distinguish safe tools from destructive ones without explicit hints.
Error handling returns raw Grants.gov error messages ('Grants.gov: unknown error') without recovery guidance. LLMs cannot determine if error is retryable, user-fixable, or fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
search_opportunities returns 'total' and 'returned' but no pagination cursor or next_offset. Large result sets (hitCount > 1000) cannot be fully retrieved. Description does not mention result cap.