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.
ezbiz-govcon has 4 tools with Zod schemas and descriptions visible in server.ts. Tool naming follows action-verb conventions (search, analyze, tracker). Descriptions are domain-specific and reasonably detailed (150-250 chars each), well above the 20-char minimum. However, there are significant gaps: (1) No output schemas documented, the code returns `{ content: [{ type: "text", text: result }] }` but does not specify what fields are in `result`; this makes it impossible for LLMs to plan downstream operations or extract structured data. (2) Parameters lack enums for constrained values (e.g., set_aside accepts '8a', 'HUBZone', 'SDVOSB', 'WOSB', 'SBA', 'all' but these are described as free-form strings, not enums); LLMs will hallucinate invalid values. (3) No error handling guidance, the code passes errors as plain text with no recovery hints. (4) Missing parameter descriptions for optional filters (naics, agency, fiscal_year are described but lack format/constraint details). (5) No pagination support documented, tools that return lists (competitor wins, agency spending) have no limit, offset, or cursor parameters, risking context window exhaustion. Naming is clear and verb-first; descriptions are above-average; but schemas, error handling, and composition patterns are weak.
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.
No output schemas documented. All tools return plain text (wrapped in MCP TextContent) but do not specify the structure of that text, preventing LLMs from extracting fields, planning downstream calls, or validating results. Code shows `{ content: [{ type: "text", text: result }] }` but 'result' is untyped.
Constrained parameters use descriptions instead of enums. The 'set_aside_type' and 'set_aside' parameters accept a fixed set of values ('8a', 'HUBZone', 'SDVOSB', 'WOSB', 'SBA', 'all') but are defined as z.string() without enum validation. LLMs cannot identify valid options and will hallucinate invalid values.
No pagination support. Tools returning lists (analyze_agency trending, competitor_win_analysis awarded contracts) have no limit, offset, cursor, or page parameters, and no documented result count. Large result sets will exhaust LLM context windows.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
No error handling guidance. The code catches errors and logs them but returns plain error messages with no recovery hints. An LLM receiving 'API timeout' has no guidance on retry strategy, whether to call a different tool, or what to ask the user.
Parameters lack format/constraint details. 'naics', 'agency', 'fiscal_year', 'company' are described only by their semantic purpose; no indication of valid format (e.g., NAICS as 6-digit code, fiscal_year as 4-digit year), length limits, or character restrictions. Baseline: 100% of A+ tools specify format constraints in parameter descriptions.
No tool annotations. The MCP spec (current 2026-07-28) supports readOnlyHint, destructiveHint, and idempotentHint annotations to clarify intent. All four tools are read-only but have no explicit annotation, forcing LLMs to infer safety from description text.