Spring Boot MCP server for managing student (discente) data with query and CRUD operations
This server exhibits critical gaps across naming, descriptions, and schema definition. While 6 tools are exposed via Spring AI's ToolCallbacks mechanism, the source code does not reveal explicit schema registration, parameter type definitions, or detailed descriptions. Tool names lack consistent verb prefixes and descriptions are minimal (8-65 chars, well below the 50-200 char optimum). Input schemas are inferred from the parameter audit provided but not visible in the source code itself, this triggers hard scoring caps. No error handling, validation guidance, or recovery paths are documented. No parameter descriptions beyond what the audit summary provides. The server appears functional for a demo use case but falls far short of production tool standards.
Cria um discente na base de dados
Busca informação dos discentes a partir da cidade informada
Busca informação dos discentes a partir do curso informado
Busca informação dos discentes a partir da linha de pesquisa informada
Exclui um discente na base de dados
Busca informação de todos os discentes
Tool names lack action verbs. 'todosDiscentes' should be 'list_students' or 'get_all_students'; 'discentesPorCidade' should be 'list_students_by_city'. Portuguese names are not ideal for LLM parsing.
Input schemas are not visible in source code; only inferred from the audit. DiscenteService.java does not show explicit @ToolParam or JSON Schema registrations. Hard cap of 0 applied to schema score for 'todosDiscentes' (no parameters declared), and 20 for parameterized tools where definitions cannot be verified in code.
Descriptions are extremely short (8 - 65 characters). Baseline is 50 - 200 chars. 'Busca informação de todos os discentes' (33 chars) does not explain WHEN to use this tool, what the output structure is, or why it exists vs other list tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 32 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
No parameter descriptions visible in source. The 'cidade' and 'curso' parameters have generic descriptions like 'The city name to filter students by' but no format constraints, examples, or guidance on handling typos or partial matches.
No error handling or recovery guidance. If a student is not found, the tool likely returns an empty list or 500 error with no hint to the agent on what to try next.
Destructive tool 'excluirDiscente' has no confirmation or dry-run support. The description says it deletes a student but does not warn that this is irreversible or ask the agent to confirm before executing.
Tool composition is unclear. 'criarDiscente' accepts a 'form' object with fields 'nome, cidade, curso, linhaPesquisa' but no schema or type info is visible. What if the LLM passes an invalid field or omits a required one?
No output schema documented. What fields does 'todosDiscentes' return? Is it a list of Student objects? What fields does each Student have? Without this, agents cannot extract or reason about the response.