Collection of AI agent implementations including deployment servers, chatbots, researchers, and analysis tools built with FastAPI, LangChain, and various LLMs
This repository is a collection of educational AI agent examples, not a cohesive MCP server. Tool definitions are scattered across multiple FastAPI applications with inconsistent schemas and minimal descriptions. Most tools lack parameter type definitions in visible schemas. Descriptions are present but generic (avg ~80 chars, below the 194-char baseline). No input validation, error recovery guidance, or output schema documentation. Security concerns: credentials in environment variables but no explicit secret injection pattern. The 'chat' and 'chat_stream' tools are HTTP endpoints, not MCP-compatible tool definitions. Overall, this reads as prototype code, not production-grade tooling.
Main chat endpoint. Sends message to AI agent and returns response.
Streaming chat endpoint. Returns response as server-sent events.
Delete all processed and uploaded documents to start fresh.
Delete a specific processed document by filename.
Health check endpoint for load balancers. Returns server status and uptime.
List all processed documents with their extracted metadata.
Save a verified high-quality source to persistent vector memory for future reuse.
chat and chat_stream are HTTP endpoints, not MCP tool definitions. They accept session_id and stream parameters that are transport-level concerns, not tool semantics. These should be removed or redesigned as stateless tool calls.
upload_pdfs parameter 'files' is typed as array but lacks element type definition and format constraints. No description of accepted file types, size limits, or error handling for invalid PDFs.
delete_all_documents is a destructive operation with no confirmation step, dry-run option, or permission gate. Agents can irreversibly delete all data in one call with no recovery path.
No output schemas documented for any tool. Callers cannot know what fields to expect (e.g., does search_web return 'snippet' or 'content'? Is 'distance' always present in search_memory results?). This forces LLMs to guess and parse unstructured responses.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
Scrape a webpage and extract its text content using httpx.
Search the persistent vector memory (ChromaDB) for previously verified sources relevant to the query.
Search the web using Tavily API for the given query. Returns a list of results with urls, titles and snippets.
Submit a design change and get visual impact analysis with annotated PDF pages.
Upload and process PDF files for extraction and analysis.
Error handling is minimal. Tools return generic status fields ('success', 'error', 'empty') with no recovery guidance. E.g., scrape_page returns 'error' with a string message, LLM cannot determine if it's retryable, user-fixable, or fatal.