Proxy MCP server that aggregates and forwards tools from multiple MCP servers, including custom Python-based servers fetched from a Metatool API
This server exposes only 2 tools with extremely minimal documentation and schema. The server is a proxy that dynamically connects to other MCP servers via an external API (Metatool API), then aggregates their tools under a naming convention (server_name__tool_name). While the concept is interesting, the implementation has critical quality gaps: (1) Tool descriptions are bare-minimum, lacking WHEN to use, prerequisites, or state-modification warnings. (2) The 'call_tool' tool accepts an arbitrary 'arguments' object with no schema validation, type hints, or documentation of expected structure. (3) No error handling guidance, the code shows try-except blocks that catch exceptions silently, with no recovery hints for the LLM. (4) The 'list_tools' tool returns a dynamic list by fetching from an external API, but the response schema is undocumented. (5) Parameter 'name' in call_tool is a free-form string with no validation, enum, pattern, or length constraints. This violates the constrained-input pattern. The server relies entirely on downstream tools and does not itself implement the quality patterns needed for LLM-friendly composition.
Call a tool from a connected MCP server using server_name__tool_name format
List all tools available from connected MCP servers
call_tool parameter 'arguments' has no schema: accepts arbitrary object with no validation, type hints, or structure documentation. LLMs cannot infer what keys/values are valid.
call_tool parameter 'name' is a free-form string with no pattern, enum, or validation. Description states format 'server_name__tool_name' but LLMs cannot parse underscore-delimited strings reliably without a formal pattern constraint.
list_tools and call_tool descriptions are under 50 characters and lack actionable context: no explanation of WHEN to use each tool, prerequisites, or dependencies between them. LLMs cannot distinguish when to call list_tools vs call_tool.
No documented output schema for list_tools. The function returns a dynamic list of tools fetched from an external API, but the response structure (fields, types, nesting) is invisible to the LLM.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 33 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 34 | - | v1 |
No error handling guidance. Code catches exceptions silently (e.g., in get_mcp_servers, get_custom_mcp_servers) and returns empty lists or continues without recovery hints. LLMs receive no actionable error messages.
call_tool does not document success vs failure cases, nor does it explain how to interpret the result of calling an arbitrary downstream tool. Agents have no way to know what the response will contain.
No mention of potential security risks: call_tool accepts any tool name and arbitrary arguments. If the Metatool API returns untrusted or malicious tool definitions, LLMs could be tricked into calling dangerous operations.