An MCP server over Canada's public tender and award data (CanadaBuys)
MapleProcure demonstrates solid tool design with clear naming (verb_noun pattern), comprehensive parameter descriptions, and well-structured schemas. All four tools have explicit descriptions (194 - 250 chars, within baseline 34 - 392 range) and typed input schemas. Parameters include enums (format, group_by, currency) and constraints (limit 1 - 100). However, output schemas are not documented in the visible code, LLMs cannot predict response structure. The export_tenders tool uses a two-phase confirmation pattern (preview/confirm) which is sophisticated but underdocumented. Error handling and recovery guidance are absent from tool descriptions. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles (3 READ_ONLY, 1 WRITE).
Export tender notices to a file (markdown or CSV) — preview first, then confirm
Search award notices — who won what, for how much
Search open tender notices — what is out for bid
Total disclosed contract value by buyer, supplier or category, for one currency
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Tools return structured data but descriptions omit what fields to expect.
No tool annotations (readOnlyHint/destructiveHint). Three tools are READ_ONLY, one is WRITE, but MCP annotations are absent. Agents cannot distinguish safe from risky operations.
export_tenders confirmation flow underdocumented. The two-phase preview/confirm pattern (confirmation parameter) is sophisticated but lacks guidance on when to call preview vs confirm, what the handle contains, or error recovery.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
No error recovery guidance in tool descriptions. Tools lack actionable error messages (e.g., 'If no results, try broader keywords or different date range'). Agents cannot self-correct on failures.
Parameter constraints not fully specified. 'limit' accepts 1 - 100 but no default stated in schema. 'keywords' and 'supplier' accept free text with no length/character constraints documented.