A multi-purpose MCP server providing task management, music player control, Wikipedia search, YouTube search, and document search capabilities
ServerMCP demonstrates critical gaps in definition quality across all 12 tools. While tool names follow basic verb_noun conventions (list_tasks, play_song, etc.), descriptions are minimal and lack LLM-critical context. All tools present schemas with proper typing, but parameter descriptions are generic and inconsistent. No error handling guidance, no output schema documentation, and no distinction between safe (read-only) and destructive operations in descriptions. This server is typical of early-stage community implementations but falls well short of production standards.
Retrieve the full Wikipedia article for a given title
Retrieve the first part of a Wikipedia article for a given title
Mark a task as complete and remove it from the task list
Get a list of all artists from the music library
Retrieve all documents for a given subject/category
Get all songs of a specific artist from the music library
Get a list of all document subjects/categories
Minimal tool descriptions lack LLM-critical context. Descriptions are 5-34 characters (well below 50-200 char baseline for A+ tools). Examples: 'List all tasks in the task list' (34 chars), 'Stop the currently playing music' (31 chars). LLMs cannot distinguish when to call similar tools (e.g., ask_wikipedia vs ask_wikipedia_short_answer) based on these brief texts.
No output schema documentation. The code shows tools return dict/list types (e.g., task_list.list_tasks() → list[dict], music_player.get_artists() → dict with 'artists' key), but no schema is exposed to the LLM. LLMs cannot plan downstream tool calls or extract fields without knowing output structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 27 | - | v1 |
List all tasks in the task list
Create a new task with the given title
Play a song by title using the music player
Search YouTube for a given query by opening the search results in a web browser
Stop the currently playing music
No error handling or recovery guidance. Code shows no try/catch blocks, no validation of user input (e.g., invalid task_id, non-existent artist), and no error messages that guide LLM recovery. If a Wikipedia query fails or a song title doesn't match, the LLM gets no guidance on what to do next.
Destructive operations not marked as such in descriptions. Tools like complete_task (removes from list), play_song (interrupts current playback), new_task (persistent change) perform writes but descriptions do not state this. LLMs cannot assess reversiblity or plan confirmation steps.
Confusing tool name pair: ask_wikipedia vs ask_wikipedia_short_answer. Names do not make the distinction obvious (full vs summary). Better: get_wikipedia_full_article + get_wikipedia_summary, or a single tool with an optional 'summary=true' parameter.
Parameter descriptions are generic or missing semantic detail. 'title' appears in 5 tools (new_task, ask_wikipedia, ask_wikipedia_short_answer, search_youtube, get_documents_of_subject) with identical description but different semantics: one is a task title, one is a Wikipedia article title, one is a search query, one is a subject name. LLMs need specific guidance.
No pagination or result limiting declared. get_songs_of_artist, get_documents_of_subject could return large unstructured lists (MusicPlayer.build_map_artist_list_songs and DocumentSearcher.get_documents_of_subject have no limits). If a user has 500 documents or 1000 songs, the agent receives a massive dump that exhausts context and increases hallucination risk.
Input validation missing or implicit. complete_task accepts a task_id integer with no bounds check. play_song accepts a title and uses fuzzy matching (MatchUtils.get_most_matching_text_item) with no validation or error message if no match is found. LLMs receive no guidance on valid ranges or recovery.
Missing tool composition guidance. Some flows are implicit: to play a song by artist, LLM must infer: get_artists → get_songs_of_artist → play_song. No description states 'Call get_artists first to discover available artists' or 'This tool requires an exact artist name.' LLMs may guess wrong.