This research server has basic tool structure but significant gaps in parameter documentation, output schema specification, and error handling. Both tools have descriptions and schemas are visible, but parameter descriptions are sparse, return types are undocumented, and there is no error guidance for agents. The tools follow simple naming conventions (verb_noun) but lack depth in LLM-optimized documentation. Per-tool scores average to 42.
Tools (2)
extract_inforead onlysource verified50/100
Search for information about a specific paper across all topic directories.
search_paperswritesource verified55/100
Search for papers on arXiv based on a topic and store their information.
No documented output schemas for either tool. search_papers returns List[str] but LLM does not know what those strings represent, their format, or how to use them downstream. extract_info returns str (JSON or error) but the structure is unclear and error cases are unstructured.
Parameter descriptions are minimal and lack constraints. 'topic' has no length/format guidance. 'max_results' has a default but no min/max bounds. 'paper_id' has no format specification (arXiv ID format is ambiguous to LLM).
No error handling guidance. extract_info returns a plain-text error message ('There's no saved information...') instead of a structured error with recovery hints. search_papers has no error handling visible for network failures, invalid queries, or file I/O exceptions.
search_papersextract_info
Recommendations
Document output schema for search_papers: return type should be an object with 'paper_ids' array and a 'count' field. Example: {"paper_ids": ["2101.12345", "2102.54321"], "count": 2, "saved_to": "papers/machine_learning/papers_info.json"}. This enables LLM to know the structure and chain to extract_info.
Document output schema for extract_info: return a structured object, not a plain JSON string. Example: {"paper_id": "2101.12345", "title": "...", "authors": [...], "summary": "...", "pdf_url": "...", "published": "2021-01-15"} on success, or {"error": "Paper not found", "suggestions": ["2101.12344", "2101.12346"]} on failure. This lets LLM parse results programmatically.
Enhance parameter descriptions: (1) For 'topic': specify expected format (e.g., 'Single topic keyword or short phrase, 2-100 characters. Examples: machine learning, quantum computing') and note that spaces become underscores in directory paths. (2) For 'max_results': add explicit bounds (e.g., '1-100, default 5. Higher values slow down search and increase disk usage.') and note that arXiv rate limits may apply. (3) For 'paper_id': specify expected format (e.g., 'arXiv paper ID in format YYMM.NNNNN or YYMM.NNNNN{vN} (e.g., 2101.12345 or 2101.12345v2). Also accepts old format (archive/NNNNNN).').
Add state modification hints to search_papers description: 'This tool creates/updates local directories and JSON files in the papers/ directory. It is a WRITE operation with side effects. Results are persistent across calls. Repeated calls with the same topic will overwrite previous results.'
Tool descriptions lack context on state modification. search_papers modifies disk state (creates directories, writes JSON) but description does not state this is a WRITE operation. LLM cannot reason about idempotence or retry safety.
No dependency or workflow guidance. Description of search_papers does not hint that extract_info requires papers to have been searched first. This forces LLM to discover the relationship via trial-and-error.
Paper ID format is ambiguous. arXiv paper IDs can be '2101.12345' (new format) or 'hep-th/0512092' (old format), with optional version suffixes. The parameter description does not specify which format is expected or how versions are handled.
extract_info
Add dependency guidance to both descriptions: (1) search_papers: 'Call this first to discover and download paper metadata from arXiv. Results are saved locally.' (2) extract_info: 'Use this to retrieve cached paper info. Requires prior call to search_papers with the same topic.'
Implement structured error handling: (1) For search_papers: return {"error": "<message>", "retryable": true/false, "guidance": "<next steps>"} on failure (e.g., arXiv timeout, invalid query). (2) For extract_info: return {"error": "Paper not found", "available_papers": [<list of cached paper_ids>], "suggestions": "Call search_papers to download new papers"} when paper not found.
Add validation: (1) topic parameter should reject empty strings and very long inputs (>100 chars). (2) max_results should clamp to [1, 100]. (3) paper_id should validate format against known arXiv patterns. Return actionable error messages for invalid inputs.
Limit and paginate results: search_papers currently caps at max_results but does not document total count or whether more results exist. Return {"papers": [...], "count": <count>, "total": <total available>} to let LLM know if pagination is needed.
Add tool annotations (if MCP version supports): Mark search_papers with 'destructiveHint: true' (writes to disk) and extract_info with 'readOnlyHint: true' (no side effects). This helps agents reason about safety and retry logic.