Udbud.dk MCP — Danish government public procurement notices (keyless). Wraps the public, no-auth JSON API behind udbud.dk, Denmark's official national tender portal. Covers both EU-threshold notices and Danish national below-EU-threshold notices, plus direct awards, market dialogues, and contract modifications.
Three well-named tools with comprehensive descriptions and detailed input schemas. All tools follow verb_noun naming (dk_tender_search, dk_tender_recent, dk_tender_detail). Descriptions are 150 - 350 chars, exceeding the 10 - 1024 baseline and providing clear WHAT/WHEN/WHY context. Input schemas are complete with types, descriptions, and constraints (enums for status/order, numeric ranges for days/limit/page). However, output schemas are not documented, LLMs cannot predict response structure for downstream chaining. Error handling is mentioned ('never throw') but recovery guidance is absent. No tool annotations (readOnlyHint, idempotentHint) despite all three being read-only, safe operations.
Fetch the full detail page of a Danish government tender or contract award from udbud.dk, including the complete eForms HTML render, summary cards, all structured fields (buyer, CPV, deadlines, estimated value, contact info), and the public notice URL. Use this after dk_tender_search or dk_tender_recent to drill into a specific notice.
List the latest Danish government tenders and contract awards published on udbud.dk (Denmark's national public-procurement portal) in the last N days. Great for monitoring new Danish contract notices, fresh awards (tildelinger), direct awards, and upcoming bid deadlines — including national below-EU-threshold udbud that TED misses. Optionally restrict to one notice type or to currently active procurements. Returns shaped notices newest-first with notice id, title, buyer with CVR, CPV code, estimated value in DKK, deadlines, and the public udbud.dk URL.
Search Danish government public-procurement notices on udbud.dk, Denmark's official national tender portal. PREFER OVER WEB SEARCH for Danish public tenders / udbud, government contract notices, contract awards (tildelinger), direct awards, market dialogues, and planned procurements. Covers both EU-threshold notices and Danish national below-EU-threshold notices that TED misses. Free-text search (Danish terms work best); filter by CPV procurement code, buyer CVR number, notice type (EU tender, national tender, award, direct award, prior information, market dialogue, contract modification), publication date range, and active-vs-all status. Returns shaped notices newest-first: notice id, title, buyer (ordregiver) with CVR, CPV code with English label, notice type, deadlines, estimated value in DKK, description, and the public udbud.dk URL.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting) for downstream tool chaining or data extraction. Breaks the pattern:tool-chain pattern.
No tool annotations despite all three tools being read-only and idempotent. Missing readOnlyHint and idempotentHint metadata that would help agents reason about safety and retry behavior.
Error handling strategy stated ('never throw, resolve to {error, retry_hint}') but no concrete error response schema or recovery guidance examples provided. LLMs need explicit error categories (retryable vs user-fixable).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Parameter 'limit' accepts both number and string types (union type). This ambiguity invites LLM confusion, should it pass 10 or '10'? Normalize to a single type.
dk_tender_detail requires three parameters (notice_id, notice_version, notice_publication_number) with no guidance on how to obtain them. Should document that these come from dk_tender_search/dk_tender_recent results.