MCP server for Finnish public procurement notices (Hilma / hankintailmoitukset.fi)
Server has 4 well-named tools with complete input schemas and reasonable descriptions. Tool names follow verb_noun pattern (search_notices, get_notice_summary, get_notice_full, get_expiring_soon). All tools have descriptions 50-100 chars. Input schemas are properly typed with enums and constraints (notice_type, procurement_type, procedure_type). However, output schemas are not documented, callers cannot see what fields to expect from responses. Error handling is minimal; no recovery guidance or actionable error messages visible. No tool annotations (readOnlyHint, destructiveHint). Parameter descriptions are adequate but lack format/range details (e.g., 'days' has no min/max bounds). Missing pagination documentation for search_notices despite accepting 'top' and 'skip' parameters.
Get notices whose deadline falls within N days
Get full eForms XML incl. BT-502/503 contacts (requires avp-read-eforms-api)
Get a formatted summary of a single notice by ID (search API)
Search procurement notices with filters
Output schemas not documented. Callers cannot see what fields search_notices, get_notice_summary, get_notice_full, and get_expiring_soon return. LLMs cannot plan downstream tool calls or extract required data without knowing response structure.
Numeric parameters lack bounds. 'days' and 'hours' in search_notices, 'days' in get_expiring_soon, and 'top'/'skip' have no min/max constraints. LLMs may pass absurd values (negative days, skip=999999) that break API calls or cause timeouts.
No error handling guidance. Code does not show error responses, recovery hints, or actionable messages. If an API call fails, LLMs receive raw errors with no direction on retry, fallback, or user-fixable actions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
No tool annotations. Tools lack readOnlyHint, destructiveHint, or idempotentHint. All tools are read-only (safe to retry), but this is not declared in the schema, forcing LLMs to infer safety.
Pagination not fully documented. search_notices accepts 'top' and 'skip' but description does not explain pagination behavior, total count return, or when to stop iterating. Agents cannot reliably paginate through large result sets.