AI-powered federal contracting intelligence — contract opportunity search, competitor win analysis, agency spending intelligence, and set-aside tracking using SAM.gov, USASpending.gov, and FPDS data.
The server presents 4 well-named federal contracting tools with clear, domain-specific descriptions (154 - 293 chars each, fitting the 10 - 1024 baseline). All tool names start with action verbs (search_, analyze_, competitor_, set_aside_). Schemas are present and use Zod for validation with typed parameters. However, several issues limit the score: (1) Output schemas are not documented, only text responses are visible, no structured return fields specified; (2) Error handling is absent from visible code, no recovery guidance, error classification, or actionable error messages; (3) Parameters lack format constraints (e.g., 'fiscal_year' accepts strings but no ISO 8601 format declared, 'set_aside_type' should be enum-constrained); (4) No evidence of pagination support in schemas despite the domain handling potentially large datasets (e.g., agency spending analysis could return 100s of contracts); (5) Tool implementations imported but not visible for validation. The descriptions are strong and naming is excellent, but schema completeness and error handling bring the score to 'good' (B) rather than 'excellent' (A).
Analyze a federal agency's spending patterns and contracting behavior — top contractors, spending trends, preferred NAICS codes, contract types, and upcoming opportunities. Uses USASpending.gov data.
Analyze a competitor's federal contract wins — awarded contracts, agencies they work with, contract values, NAICS codes, and win patterns. Find out who's winning in your space and what they're doing differently.
Search federal contract opportunities on SAM.gov — filter by NAICS code, set-aside type, agency, dollar range, and keywords. Returns active solicitations with due dates, contact info, and bid requirements.
Track small business set-aside opportunities across federal agencies — 8(a), HUBZone, SDVOSB, WOSB, and SBA set-asides. Shows trending categories, upcoming deadlines, and agency set-aside spending patterns.
Output schemas not documented. All 4 tools return `{ content: [{ type: 'text', text: result }] }`, but the structure and fields of `result` are invisible. LLMs cannot plan chained calls or extract structured data without knowing return fields (e.g., does search_contracts return contract_id, agency, due_date as separate fields or one text blob?). Pattern requires documented return types.
No error handling or recovery guidance visible. If a contract search returns 0 results or an agency name is misspelled, the code does not show how errors are classified (retryable vs. user-fixable), what actionable feedback is returned to the LLM, or how agents should recover. Pattern requires recovery guides and error classification.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 54 | - | v1 |
Enum constraints missing for bounded parameters. 'set_aside_type' in search_contracts and set_aside_tracker should declare enum: ['8a', 'HUBZone', 'SDVOSB', 'WOSB', 'SBA', 'all']. Currently defined as free-form strings, inviting hallucinated values. Fiscal year and agency name similarly lack validation patterns. Pattern recommends constrained-input.
No pagination or result limits declared in schemas. Federal contracting databases can return 1000s of contracts; an agency spending analysis could include dozens of top contractors. Schemas do not show limit/offset/page_size params, nor do descriptions state a cap on results returned. Pattern requires paginated-result structure.
Tool implementations not visible for validation. server.ts imports from ./tools/* but the actual implementations (contract-search.ts, agency-analysis.ts, etc.) are not provided. Cannot verify whether parameters are validated, whether outputs include chaining IDs, or whether external API calls have timeouts and error handling. Score capped at 50 for visible tool definitions lacking implementation proof.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. All 4 tools are read-only (per the brief), but this is not declared in the server code via Zod metadata or MCP annotations. Current spec supports tool annotations for clarity; their absence is not penalizing but leaves ambiguity for strict clients.