Demonstrates LLM tool calling with Anthropic Claude API, MCP-like router pattern for tool execution, and RAG (Retrieval-Augmented Generation) implementation with vector embeddings
This is a showcase/demo implementation, not a production MCP server. Tools are defined in custom TypeScript interfaces (ToolDefinition) rather than via MCP protocol. The two tools have basic descriptions but lack critical schema rigor: no explicit input validation, no output schema documentation, no error recovery guidance. Parameter descriptions are minimal (entity_id, time_period_days lack format/range constraints). No tool annotations (readOnlyHint, destructiveHint). The codebase shows LLM integration patterns but does not implement MCP protocol compliance. Tool definitions are inferred from code rather than formally registered via MCP.
Comprehensive data analysis tool with multi-modal data integration
Get quick summary of entity data
No output schema documented. Tools return unstructured JSON without field definitions, forcing LLMs to parse results blindly. analyze_data returns 'aggregatedData' (undefined structure); get_summary returns '{summary: string}' with no type safety.
Parameter descriptions lack constraints. 'time_period_days' has no min/max bounds (default 730 suggests 0-730 range, but not stated). 'entity_id' has no format guidance (UUID? alphanumeric? length limits?). LLMs will pass invalid values without explicit constraints.
No error recovery guidance. Router returns generic errors ('Tool execution failed', 'Unknown tool') without actionable next steps. LLMs cannot distinguish retryable vs fatal failures or know what to try next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 36 | 2026-07-28+ | v2 |
Tool definitions are inferred from code, not formally registered via MCP protocol. This is a custom HTTP router mimicking MCP, not an actual MCP server. No MCP handshake, no capabilities negotiation, no protocol versioning.
No tool annotations. Neither tool declares readOnlyHint (both are read-only per risk assessment), destructiveHint, or idempotentHint. LLMs cannot reason about retry safety or side effects.