ProZorro MCP — Ukraine government procurement (keyless). Wraps the public OpenProcurement/ProZorro API to access Ukraine's national e-procurement system. Covers paginated public change-feed of tenders and full tender detail including title, value, procuring entity, status, periods, and line items.
Three well-named tools with strong, detailed descriptions (194 - 392 chars each, well above baseline). Input schemas present with type declarations and required fields. However, parameter descriptions lack specificity on constraints (e.g., 'limit' accepts number|string but no validation guidance; 'scan' range 1 - 200 stated in description but not in schema). Output schemas are not documented, LLMs cannot predict response structure. Error handling returns { error } but lacks recovery guidance. No tool annotations (readOnlyHint, idempotentHint). Overall solid foundation but missing schema completeness and output documentation expected of production tools.
Full detail for a single Ukraine ProZorro tender by id (via the keyless OpenProcurement public API). Returns tenderID, title, description, status, procurement method, value (amount+currency), the buyer/procuring entity (name, EDR identifier, region, contact), tender period (start/end), enquiry period, number of bids, and line items (description, CPV classification, quantity, unit). Text is largely Ukrainian. Accepts the 32-char tender id from prozorro_recent_tenders / prozorro_search_tenders.
Most recently updated tenders from Ukraine's ProZorro national procurement system (via the keyless OpenProcurement public feed). Returns each tender with id, tenderID, title, value (amount+currency, usually UAH), buyer (procuring entity), status, and procurement method. Titles and buyer names are in Ukrainian. Use for browsing current Ukrainian public tenders; for a specific tender use prozorro_get_tender.
Keyword search over recent Ukraine ProZorro tenders (keyless OpenProcurement public feed). Best-effort: scans the recent public feed and returns tenders whose title/buyer/tenderID match the query (case-insensitive substring; Ukrainian text supported — pass Ukrainian keywords for best recall). Returns id, tenderID, title, value, buyer, status. NOTE: this is not a full-text index of all history — ProZorro's front-end search API is not reachable from datacenter egress, so this filters the recent feed only. For older or exact tenders use prozorro_get_tender with a known id.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). getTender returns a shaped object with buyer, tenderPeriod, items, etc., but no schema is visible to the client.
Parameter type coercion not validated. 'limit' and 'scan' accept number|string but no schema validation or error message guides LLMs on invalid input (e.g., 'limit=abc' or 'limit=999'). Validation happens inside callTool but errors are generic.
No tool annotations. All three tools are read-only and idempotent, but lack readOnlyHint and idempotentHint annotations. LLMs cannot infer safety properties without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. callTool catches exceptions and returns { error: message }, but does not categorize errors (retryable vs. user-fixable) or suggest next steps. E.g., 'tender not found' should suggest 'Try prozorro_search_tenders() with a keyword.'
Parameter descriptions lack constraint details. 'limit' description says '1-50' but schema does not enforce it; 'scan' says '1-200' in description but schema allows any number|string. Formal constraints (minimum, maximum in schema) are missing.