A unified MCP tool graph system that dynamically retrieves and orchestrates tools from multiple MCP servers using semantic similarity search, Neo4j graph database integration, and agent-based task decomposition.
This MCP server has critical definition quality issues across all dimensions. Tool definitions are present but severely under-specified. Only 2 of 5 tools have meaningful input schemas; descriptions vary from acceptable to vague; parameter descriptions are mostly absent; output schemas are not documented; error handling is minimal. The server exposes internal implementation details (Neo4j, GitHub API URLs) without proper abstraction. Code review reveals tool definitions are inferred from LangChain/FastMCP registration rather than explicitly declared in a canonical registry, which triggers the cap-at-50 rule for tools where implementation is not directly visible. The dynamic_tool_retriever appears twice with different descriptions (one real, one mock), suggesting incomplete refactoring.
Retrieve the most relevant tools for a given task description. This function performs intelligent tool retrieval through: 1. Semantic embedding of the task description using local Sentence Transformers 2. Vector similarity search in Neo4j graph database 3. MCP configuration extraction from vendor repositories 4. Environment validation and compatibility checking 5. Intelligent ranking and selection of top-k tools
Mock dynamic tool retriever that returns dummy tool suggestions.
Extract MCP server configuration from a GitHub repository URL
Get a list of all available tools in the mock knowledge graph.
Health check endpoint for the dummy tool retriever.
Duplicate tool name 'dynamic_tool_retriever' with conflicting descriptions and schemas. One is a real semantic retriever, the other is a mock. This creates ambiguity for LLMs about which tool to invoke and indicates incomplete refactoring or test code left in production definitions.
get_available_tools and health_check have empty input schemas ({}). Per HARD SCORING RULES, tools with no input schema at all must score 0 for schema. These tools provide no parameter guidance to LLMs.
Output schemas are not documented for any tool. LLMs cannot determine what fields to expect in responses, making it impossible to plan downstream tool calls or extract the right data. This violates pattern:tool (Schema & Output documentation is required).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 40 | - | v1 |
Parameter descriptions are missing or minimal. For example, 'repo_url' in extract_config_from_github has description 'GitHub repository URL' (19 chars), which is below the 20-char minimum for actionable descriptions. 'top_k' parameter in dynamic_tool_retriever lacks constraints on what 'relevant' means or how ranking is performed.
Tool descriptions do not explain error scenarios or recovery paths. For example, dynamic_tool_retriever does not document what happens if Neo4j is unavailable, if the embedding model fails, or if no tools match the query. Per pattern:recovery-guide, error responses must tell the LLM what to do next.
Tools expose internal implementation details (Neo4j graph database, Sentence Transformers embeddings, GitHub vendor repository URLs) in their descriptions. This violates the abstraction principle, tool descriptions should describe what the tool does from the user/agent perspective, not the implementation. Agents should not know or care about Neo4j.
No enum constraints on parameters. For example, 'official_only' is a boolean, but the description should clarify what 'official' means (MCP community standard? Author-verified? Vendored by Anthropic?). Parameters like 'repo_url' should accept full GitHub URLs, but no format constraint is specified.
Tool definitions inferred from code rather than explicitly registered. The source code shows LangChain/FastMCP function decorators and imports (e.g., 'from langchain_mcp_adapters.client import MultiServerMCPClient'), but no canonical tool registry is visible. Per HARD SCORING RULES: 'If you cannot see the actual tool definition in the source (only inferred), cap that tool's overall at 50.' This cap applies to all tools where explicit schema registration is not shown.
No idempotency guarantees or acknowledgment of side effects. dynamic_tool_retriever is marked READ_ONLY, but extract_config_from_github may invoke external GitHub API and should state whether repeated calls with the same repo_url are safe to retry or cache.