A multi-variant MCP server implementation demonstrating personal, external API integration, and organization-scoped todo management using Spring AI and Spring Boot
This server has 16 tools with significant quality gaps. Tool naming is inconsistent, multiple tools share identical names (list_todos, get_todo, add_todo, complete_todo, search_todos appear 2-3 times each across different files), violating the single-responsibility principle and creating ambiguity for LLMs. Descriptions are present but minimal (avg ~60 chars, well below the 194-char baseline for A+ tools). Parameter descriptions are sparse; many parameters lack type information in visible schemas. No output schemas are documented. Error handling is absent, no recovery guidance, no categorization of retryable vs. fatal errors. The code shows @Tool and @ToolParam annotations with descriptions, but schemas are inferred from method signatures rather than explicitly declared, making validation difficult. No evidence of pagination, rate limiting, or result capping despite tools returning lists.
새 할일을 추가합니다. JSONPlaceholder는 fake API라 실제 저장되지 않습니다.
현재 사용자에게 새 할일을 추가합니다.
새 할일을 추가합니다. memo는 선택입니다.
할일을 완료 처리합니다. JSONPlaceholder는 fake API라 실제 저장되지 않습니다.
ID에 해당하는 할일을 완료 처리합니다.
현재 사용자의 할일을 완료 처리합니다.
ID로 할일 한 건을 조회합니다.
ID로 할일 한 건을 조회합니다.
Duplicate tool names across multiple servers (list_todos, get_todo, add_todo, complete_todo, search_todos appear 2-3 times). LLMs cannot disambiguate which implementation to call. Violates single-responsibility principle and breaks tool composition.
No output schemas documented. Tools return TodoView, GetResult, CompleteResult, and List<TodoView>, but LLMs have no visibility into field names, types, or structure. Prevents downstream tool chaining and forces LLMs to guess field names.
No error handling or recovery guidance. Tools return Optional<T> internally but expose no error messages, categorization, or next-step hints to LLMs. A missing todo returns found=false with no explanation of why or what to do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2026-07-28+ | v2 |
ID로 할일 한 건을 조회합니다.
모든 할일(Todo) 목록을 반환합니다.
JSONPlaceholder fake Todo 목록을 반환합니다 (기본 20건).
현재 사용자의 할일 목록을 반환합니다.
특정 사용자(userId)의 할일 목록을 반환합니다.
제목에 키워드가 포함된 할일을 검색합니다 (전체 200건 중).
제목과 메모에서 키워드를 포함하는 할일을 검색합니다.
현재 사용자의 할일 중 키워드 검색.
Descriptions are minimal (avg ~50 chars, well below 194-char baseline). Many lack context on WHEN to use the tool or what distinguishes it from similar tools. E.g., 'ID로 할일 한 건을 조회합니다' (Get one todo by ID) does not explain when to use get_todo vs. search_todos.
No pagination, result capping, or limit parameters on list tools. list_todos() returns all todos with no offset/limit. Large result sets will exhaust context windows and degrade LLM reasoning.