An MCP server for downloading songs from xmwsyy.com using Selenium WebDriver automation
This MCP server exhibits severe quality issues across naming, descriptions, and schema documentation. Of 14 tools, only 2 have descriptions that minimally meet standards (initialize_browser, download_song). The remaining 12 tools have either trivial descriptions, descriptions in non-English (Chinese), or descriptions that fail to explain WHEN/WHY to use them. Most critically, the server mixes browser automation tools (Selenium-based, Python) with JavaScript DOM query functions (getMusicList, sortByReleaseDate, searchMusic) and generic utilities without coherent tool composition. No tools declare input schemas explicitly in the visible source code, parameter types are inferred from parameter names alone. Tool descriptions average 58 characters, well below the 194-char baseline for A+ tools. Four tools (getMusicList, getThumbInfo, getReleaseYearStats, getSongTitles) accept NO parameters yet their descriptions are vague about what they return or when to invoke them. The schema assessment is hampered by incomplete source visibility; most tool definitions are inferred rather than directly registered. This server would not pass a production code review.
Download multiple songs from a file list
Downloads an MP3 from xmwsyy.com based on the song name
Download a single song using the existing browser session
查找所有符合条件的 li 元素,获取所有带有 data-list-li-li 类的 li 元素
提取发布年份统计 - Extract release year statistics
获取所有歌曲名称的简单函数 - Get all song titles
获取特定歌手的所有歌曲 - Get all songs by a specific singer
获取缩略图信息 - Get thumbnail information for all music items
Six tools (getMusicList, getThumbInfo, getReleaseYearStats, getSongTitles, observeMusicList, sortByReleaseDate) have descriptions under 50 characters, many in Chinese, providing minimal guidance on WHEN/WHY to call them or WHAT they return. Pattern 'tool-description' requires descriptions to answer 'What does it do? When should the LLM call it? What does it return?'
No explicit input schemas visible in source code for most tools. Parameter type information is inferred from names only (e.g., 'ascending' → boolean, 'callback' → function). This affects 6+ tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 30 | 2026-07-28+ | v2 |
从详情页获取下载链接 (新结构: /dls/<code>.html → JS 跳转到 quark/139) 优先选 rmk (夸克 MP3),其次 rwk (夸克 WAV),再退到 rym/ryw (139.com)
Initialize and return a Chrome browser with saved cookies if available
监听列表变化 - Monitor for changes to the music list
Read a list of songs from a text file, one song name per line
搜索功能 - search for music by keyword
按发布日期排序
Severe tool composition problem: Selenium browser automation tools (initialize_browser, download_song, batch_download_from_file, download_mp3) are mixed with JavaScript DOM query functions (getMusicList, searchMusic, getSongsBySinger, sortByReleaseDate, observeMusicList) that cannot execute in a Python/Selenium context. An MCP server must have coherent tool composition, these appear to be from multiple unintegrated sources.
Five tools (initialize_browser, download_song, batch_download_from_file, download_mp3, get_download_links_with_curl) perform WRITE operations (download files, modify browser state) yet lack error handling guidance per pattern 'recovery-guide'. Descriptions do not indicate what to do if download fails, network errors, or authentication expires. No retry guidance or error categorization (retryable vs fatal).
Naming violations: 'getMusicList', 'sortByReleaseDate', 'getSongsBySinger', 'getThumbInfo', 'getReleaseYearStats' use camelCase instead of snake_case verb_noun convention. Also, 'observeMusicList' is vague, does it return changes immediately, poll, or register a callback? LLM cannot infer intent from the name alone.
Parameter 'driver' in download_song and batch_download_from_file is typed as 'object' with description 'Selenium WebDriver instance'. This is opaque to an LLM, the LLM cannot easily understand how to obtain a driver object or what methods it provides. Either accept a session ID/name instead, or document the expected driver type and initialization prerequisites explicitly.
Tool 'observeMusicList' accepts a 'callback' parameter typed as 'function'. MCP tools run in agent sandboxes and cannot accept function pointers as parameters, this is not a valid MCP pattern. Callback-based designs should be replaced with event streams, polling, or resource URIs.
Four tools (getMusicList, getThumbInfo, getReleaseYearStats, getSongTitles) have empty input schemas (no parameters), yet their descriptions do not explain what they return or what preconditions must be met (e.g., must a browser session be active? must a song list already be loaded on the page?). Per pattern 'tool-description', descriptions must explain prerequisites.
Tool 'initialize_browser' mentions saving cookies to 'quark_cookies.pkl', a file path hardcoded on the server. No parameter allows the caller to specify where cookies are stored or which account to use. This is inflexible for multi-user or multi-account scenarios and violates the chat-data-model pattern, the LLM has no way to select different credentials or sessions.