MCP server for searching federal grant opportunities via the Grants.gov API
Two well-defined tools with clear schemas, good parameter descriptions, and proper type constraints. Both tools have comprehensive docstrings and proper annotation hints. The server follows the single-responsibility principle effectively, splitting search and fetch operations. Tool naming is verb-first and action-oriented. Schemas include proper enums, bounds constraints, and optional/required field distinctions. Main gaps: output schemas are documented only in descriptions (not in JSON Schema format); no error handling patterns documented; no recovery guidance for common failure modes.
Fetch full details for a single grant opportunity by its numeric ID. Retrieves comprehensive information about a specific Grants.gov opportunity including synopsis, eligibility, award amounts, contact info, funding instruments, activity categories, ALNs, and attachments. Use grants_gov_search_opportunities first to find opportunity IDs. No authentication is required.
Search for federal grant opportunities on Grants.gov. Queries the Grants.gov search2 API to find funding opportunities matching the given criteria. Supports full-text keyword search and filtering by agency, status, eligibility, and funding category. Returns paginated results. No authentication is required.
Output schema not formally documented in tool definitions. Descriptions mention 'paginated results' and 'comprehensive information' but JSON Schema output types are missing. LLMs cannot predict response structure for downstream planning.
No error handling or recovery patterns documented. Descriptions do not indicate what happens on API failure, rate limiting, invalid opportunity IDs, or malformed searches. LLMs cannot plan error recovery.
No result limiting or pagination guidance in tool description. While grants_gov_search_opportunities accepts 'rows' parameter (capped at 100), the description does not state that results are paginated or explain when pagination is necessary. Agents may be surprised by truncated results.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
Parameter 'response_format' with enum ['markdown', 'json'] lacks clear guidance on when to use each. No description explains which format suits which LLM use case or what the output structure differs between them.
Tool descriptions do not indicate which fields from search results can be used as input to fetch_opportunity. E.g., if search returns 'opp_id', does fetch_opportunity expect that same field name in 'opportunity_id'? Field naming consistency for chaining is unclear.