Static source inference · medium confidence · detected: Logging
Deprecated protocol patterns detected
Summary
This server has critical gaps in definition quality across multiple dimensions. While all 6 tools are explicitly registered with names and descriptions, the schemas lack proper type constraints, most parameters are under-described, and error handling is minimal. Tool naming generally follows verb-noun convention (wiki_search, save_txt, writer_tool, review_tool, assemble_content, arxiv_search), but descriptions are superficial (10-80 chars), and parameter descriptions are missing or trivial. The save_txt tool exhibits a dangerous pattern: it calls an LLM (gpt-5-nano, which does not exist in OpenAI's API) without validation, could fail silently, and appends to files without proper error recovery. Output schemas are not documented. The server would fail code review on security, composability, and error guidance grounds.
Tools (6)
arxiv_searchread onlysource verified62/100
Search arxiv for the given query on topics such as science, math, engineering, etc.
Missing parameter type constraints and descriptions. 'sentences' param in wiki_search has no min/max bounds; 'content' params in writer_tool, review_tool, and assemble_content lack guidance on expected length or format. LLMs will hallucinate unbounded text sizes.
save_txt tool calls non-existent LLM model 'gpt-5-nano' without error handling or validation. This will always fail at runtime. The tool description ('Save text to a .txt file') contradicts its implementation (which calls an LLM to format content). This is misleading to agents.
No output schemas documented. Tools return untyped strings (e.g., wiki_search, writer_tool, review_tool, assemble_content). LLMs cannot plan downstream calls or extract structured data. This violates the 'return structured objects' pattern.
wiki_searchwriter_toolreview_tool
Recommendations
Rewrite tool descriptions to 100 - 200 chars and explicitly state: What does this tool do? When should an agent call it? What does it return? Example: 'Searches Wikipedia for articles matching a query and returns a summary. Use this to gather factual background information. Returns a plain-text summary (1 - 5 sentences) or an error message with alternatives if disambiguation is needed.'
Add type constraints and bounds to all parameters. Example: 'sentences: integer, 1 - 10 (default 2). Controls summary length; values outside this range may timeout or return incomplete results.' Add min/maxProperties to JSON schemas.
Add descriptions to every parameter. Example for 'content': 'The text content to save or process. Should be plain text or markdown, 1 - 10,000 characters. Very large content may be truncated by the LLM.'
Document all output schemas explicitly. Example: 'wiki_search returns: {"summary": string, "source": string, "alternatives": [string] | null}'. Include field type, range, and when it may be null.
Fix save_txt immediately: (1) Replace 'gpt-5-nano' with 'gpt-4o-mini' or similar valid model. (2) Correct the tool description to 'Formats text using an LLM and appends it to a file, with a timestamp.' (3) Add try-catch with actionable errors: 'Failed to format content with LLM: {error}. Ensure your OpenAI API key is valid and quota is available.' (4) Add idempotent mode: 'Check if content already exists in file before appending to prevent duplicates.'
Add error recovery guidance. Instead of 'An error occurred: {e}', return: 'Wikipedia search for "{query}" failed: {reason}. Try: (1) Simplify your query (e.g., remove special characters), (2) use arxiv_search for academic topics, or (3) provide more context in your request.'
Spec posture evidence
Inferred effective spec: 2026-07-28+.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Minimal error recovery guidance. Exception handlers in wiki_search return generic strings like 'An error occurred: {e}'. LLMs receive no actionable recovery path, no suggestion to try a different query or alternative tool.
Tool descriptions are too brief (10 - 80 chars), below the 194-char average for production tools. 'Save text to a .txt file' (24 chars) does not explain when to use it, what it returns, or that it calls an LLM. Descriptions do not answer: What does it do? When should the LLM call it? What does it return?
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). save_txt is clearly destructive (appends to files) but carries no annotation. LLMs cannot determine which tools are safe to retry or compose without side effects.
Parameter descriptions missing or trivial. 'content' param in save_txt: no description. 'content' in writer_tool, review_tool, assemble_content: no descriptions. 'query' param in arxiv_search: no description. LLMs cannot infer what values are expected.
No composition support for batch operations. Tools like writer_tool and review_tool operate on single strings. If an agent needs to process 10 items, it must call the tool 10 times, wasting tokens and latency. No batch variants offered.
Idempotency not guaranteed. save_txt appends to a file without checking if content already exists. Repeated calls with identical input produce duplicate entries. Agents should not retry this tool, but no guidance is provided.
save_txt
Add tool annotations. Mark save_txt with destructiveHint: true (modifies filesystem). Mark wiki_search, writer_tool, review_tool, assemble_content, arxiv_search with readOnlyHint: true.
Create batch variants: writer_tool_batch(queries: [{query, content}]) and review_tool_batch(contents: [string]) to support processing multiple items in one call without token waste.
Implement idempotent save_txt: Check file content before appending. Return 'Content already saved' if identical text exists, preventing accidental duplicates on retry.
Add natural-identifier support. If arxiv_search takes a query, document examples: 'Query examples: "neural networks", "quantum computing 2024", "author:LeCun". Supports arXiv search syntax.' Provide format guidance so agents pass valid queries.
Validate inputs early. Example: in save_txt, validate filename against path traversal: reject paths containing '..', enforce '.txt' extension, and return 'Invalid filename: must end with .txt and contain no path separators'.
Return per-item success/failure for batch operations. Example: if review_tool_batch processes 5 items and 1 fails, return [{success: true, content: ...}, ..., {success: false, error: "LLM timeout", original_content: ...}] instead of failing entirely.