Deep research MCP server: multi-source search + CRAAP evaluation + cross-verification + professional reports
Three tools with complete schemas and descriptions, but significant gaps in error handling, output documentation, and composition patterns. Tool names are clear (verb_noun style), descriptions are adequate (150-250 chars), and all parameters have types and descriptions. However, no documented output schemas, missing error recovery guidance, and the async polling pattern (harness_research → harness_status) lacks idempotency guarantees and retry semantics. No tool annotations (readOnlyHint/destructiveHint). harness_research is marked WRITE risk but lacks confirmation/dry-run pattern.
Start a deep research session: multi-source search (Tavily/Brave/arXiv/PubMed/Tushare) + CRAAP source evaluation + cross-verification → professional HTML/DOCX/PDF report. IMPORTANT: This tool returns IMMEDIATELY with a task_id. The research runs in the background and takes ~8-12 minutes. After calling this tool, you MUST poll harness_status with the returned task_id every 30-60 seconds until status is "completed" or "failed". Do NOT wait idle — poll actively. Workflow: 1. Call harness_research → get task_id (returns in <1 second) 2. Call harness_status with task_id every 30-60s to check progress 3. When status is "completed", harness_status returns the output file paths Driven by affordable models like Kimi K2.5 (~$0.01/run).
Quick multi-source search without generating a full report. Returns structured results from Tavily, Brave, arXiv, and PubMed. Completes in seconds.
Check the progress of a research task started by harness_research. After calling harness_research, you MUST poll this tool with the returned task_id every 30-60 seconds. - status "running": research is in progress, keep polling - status "completed": research is done, output file paths are included - status "failed": an error occurred, error message is included If no task_id is provided, lists all tasks.
No documented output schemas. Tools return text responses but LLMs cannot parse structured fields (task_id, status, file paths, result counts). Downstream tool chaining is impossible without LLM text parsing.
harness_research (WRITE risk) lacks confirmation/dry-run pattern. Agents can trigger 8-12 minute background jobs without preview or approval. No idempotency guarantee, retrying with same task_id may spawn duplicate research runs.
Error handling is minimal. No recovery guidance. If API keys are missing, response says 'run setup' but does not indicate which keys or why. If search fails, no fallback or partial results offered.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
harness_status polling pattern is not idempotent. Calling harness_research twice with identical args may create two separate task_ids. No deduplication or request ID tracking to prevent duplicate work.
harness_search returns text-formatted results (concatenated strings) instead of structured JSON array. LLM must parse '[1] Title\n URL\n Source' format, error-prone and wastes tokens.