Multi-tenant MCP server integrating Espen.ai with D6 School Information System
This server has 8 tools with schemas visible and descriptions present, but most tools have weak descriptions (averaging ~50 chars), lack parameter descriptions for optional fields, and provide no documentation of output schemas or error handling. Naming is correct (verb-driven: get_*), but descriptions are minimal and do not explain when/why to use each tool or what fields are returned. No tool annotations (readOnlyHint/idempotentHint) are present despite all tools being read-only. Parameter schemas are present but sparse, most optional parameters like schoolId lack descriptions. The server appears to prioritize minimal descriptions over LLM-optimized clarity. This is typical of early-stage integrations (C-grade) that prioritize function over usability.
Get information about the current D6 integration setup
Get academic marks for a specific learner
Get learners from the D6 system with optional school filtering
Get system lookup data (genders, grades, languages, etc.)
Get parent information from the D6 system
Get list of schools available in the D6 system
Descriptions are minimal (20-50 chars) and do not explain when to use each tool or what output to expect. LLMs need 50 - 200 char descriptions that cover WHAT, WHEN, and RETURN VALUE.
Optional parameters (schoolId, learnerId for get_parents, etc.) lack descriptions. LLMs cannot infer what these parameters control without explicit docstrings.
No output schemas documented. LLMs do not know what fields (school_id, name, etc.) are returned by each tool, making it impossible to chain calls correctly or extract required data.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 46 | <=2025-11-25 | v2 |
| 2026-03-09 | C | 61 | - | v1 |
Get staff members from the D6 system with optional school filtering
Check D6 API connectivity and system health
No error handling guidance. Tools do not document what errors can occur (API unavailable, invalid ID, rate limit, etc.) or what the LLM should do next (retry, ask user, fail).
All tools are read-only but lack readOnlyHint tool annotations. LLMs cannot infer call safety without explicit hints, risking over-cautious reasoning or incorrect idempotency assumptions.