A comprehensive MCP server suite providing tools for arXiv research papers, YouTube video analysis, weather forecasting, and general utilities, with FastAPI frontend and LLM integration
This server exhibits multiple critical definition quality gaps. Tool names use inconsistent conventions (Search_Arxiv_Papers uses PascalCase with underscores, others use lowercase). Descriptions vary widely in quality, arxiv tools have reasonable descriptions (80-120 chars), but greet/add are trivial (20-40 chars), violating the minimum 10-1024 character baseline. Parameter descriptions are present but often generic (e.g., 'The topic to search for' lacks context on format, length, or constraints). No output schemas are documented, tools return either List[str] or str without specifying structure, field names, or next-step guidance. The gradio_server.py appears to be a Gradio interface, not an MCP tool registration, and is inferred rather than explicitly registered. Critical gaps: no enum constraints for parameters like state codes or language codes, no error handling guidance, and no chaining IDs in responses (e.g., search_arxiv_papers returns paper_ids without titles, forcing a second call to get_paper_info). The youtube_server.py code is truncated mid-function, making full assessment impossible. Overall, this reads like educational/prototype code rather than production-grade tooling.
Retrieves detailed metadata for a specific research paper using its arXiv ID.
Returns subtitles for a YouTube video. Checks locally first; if not found, downloads and stores them with timestamps.
Searches arXiv for relevant research papers on a topic and stores their metadata locally.
Add two numbers and return the result
Get weather alerts for a US state.
Get weather forecast for a location.
Greet a user by name
Inconsistent tool naming convention: mix of PascalCase (Search_Arxiv_Papers, Get_Paper_Info_By_ID) and lowercase (greet, add, get_alerts). This violates verb_noun convention and creates cognitive friction for LLMs selecting tools.
Trivial descriptions for greet and add (20-40 chars). Description for 'greet' is 'Greet a user by name' and 'add' is 'Add two numbers and return the result'. Below the 10-1024 character guideline and lack context on when/why an LLM should invoke them.
No documented output schemas. Tools return str or List[str] without specifying structure. search_arxiv_papers returns List[str] (paper IDs only) but downstream get_paper_info_by_id needs those IDs, no guarantee IDs are in the expected format. LLMs cannot plan chaining without knowing field names and types.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 7 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 31 | - | v1 |
No enum constraints on parameters with known discrete values: state parameter in get_alerts should be constrained to valid US state codes (CA, NY, TX, etc.), lang parameter in get_youtube_subtitles should list supported language codes. Free-form strings invite hallucinated values.
Parameter descriptions lack constraints and format guidance. 'The topic to search for' does not specify expected length, format, or examples. 'Latitude of the location' does not specify range (-90 to 90) or precision.
No error handling guidance. If a paper_id is not found in get_paper_info_by_id, the tool returns a plain string 'No information found for paper ID: {paper_id}.' rather than a structured error that tells the LLM what to do next (e.g., 'Paper not found. Try search_arxiv_papers with a related keyword.'). Per pattern:recovery-guide, error responses must guide the agent's next step.
Response field naming inconsistency and missing chaining IDs. search_arxiv_papers returns only paper_ids (List[str]). To use get_paper_info_by_id, the LLM must already know the ID structure. Response should include titles, summaries, or other metadata to avoid forcing a second tool call.
youtube_server.py code is truncated mid-function (ends at 'dict_data.pop(next(iter(dict_data))) # Remove oldest'). Cannot fully assess Get_YouTube_Subtitles tool or verify error handling, return schema, or security practices. Tool definition is incomplete/inferred.
gradio_server.py appears to be a Gradio web UI interface (gr.Interface, demo.launch()), not an MCP tool registration. It defines a letter_counter function but does not explicitly register it as an MCP tool using @mcp.tool() decorator. Tool existence is inferred, and per hard scoring rules, inferred tools are capped at 50 overall.
No documentation of pagination, rate limits, or result caps. search_arxiv_papers defaults to max_results=5 but does not document if larger values are supported or if there is a hard limit. get_forecast and get_alerts do not specify maximum number of results or warn about context window impact.