A FOSS-first capability and evidence layer for AI agents (MCP + CLI). Exposes search, fetch, extract, evidence query, research packet export, connector health, capability listing, and surface status tools.
D-Eye provides 10 tools with consistent naming (verb_noun pattern: search, fetch, extract, query_evidence, export_research_packet, semantic_search, repo_inspect) and reasonable descriptions (avg ~80 chars). All tools are READ_ONLY and well-scoped. However, parameter descriptions are minimal or absent in the schema definitions visible in mcp_server.py. Input schemas are present but lack detailed type constraints, enums, or validation guidance. Output schemas are not formally documented. Error handling is implicit (via exceptions) rather than explicit recovery guidance. No tool annotations (readOnlyHint, etc.) despite all being read-only.
List all registered capabilities and available tools
Check health status of all registered connectors
Execute end-to-end research workflow: search, fetch top results, extract, and export as markdown packet
Extract plain text from HTML content
Fetch and extract content from a URL
Query the persistent evidence store built up by prior research runs
Read-only GitHub repository inspection (owner/name or a github URL)
Output schemas not documented. Tools return dicts (e.g., {content, artifacts}, {markdown, source_count}) but LLMs cannot see the structure in advance. This forces runtime discovery and risks field-mapping errors.
Parameter descriptions missing or minimal in FastMCP decorator definitions. The 'query' param in search() has no description visible in the tool registration; LLMs must infer intent from the tool name alone.
No tool annotations despite all tools being read-only. FastMCP supports readOnlyHint; adding @server.tool(readOnlyHint=True) would signal safety to agents and enable optimizations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Search across registered connectors for a query
Keyless semantic search over stored evidence using local embeddings, returning a cited answer
Get current surface status and honest limits
Error handling is implicit (exceptions bubble up). No recovery guidance in responses. E.g., if fetch() fails on a URL, the LLM gets a raw error with no suggestion to try a different URL or call search() first.
No pagination or result limits documented for search() and semantic_search(). If these return large result sets, context window exhaustion is possible. Baseline pattern requires limit/offset and total count.