A Model Context Protocol server
Single tool with critical definition and architectural gaps. Tool name is action-prefixed ('get_python_docs') but description is vague. Input schema is present but lacks proper documentation. Most critically, the tool implementation reveals a fundamental design flaw: it attempts to call external MCP servers (brave-search) from within an MCP server, which violates the MCP architecture, servers are not clients and cannot invoke other servers' tools. This is not a valid MCP pattern. No output schema is documented, no pagination support despite returning search results, and error handling provides raw error text without recovery guidance.
Get Python documentation for a given query
Fundamental architectural violation: MCP server attempts to invoke another MCP server's tools (brave-search) via '(server as any).callMcpTool()'. MCP servers are not clients and cannot call other servers. This pattern is invalid and will fail in any compliant MCP host.
No output schema documented. The tool returns text content but LLMs cannot determine what fields or structure to expect. This violates pattern:tool which requires documented output schemas for all tools.
Tool description is generic and vague (32 chars): 'Get Python documentation for a given query'. Does not explain what the tool actually does (web search), when to use it vs alternatives, what format results come back in, or whether this queries official Python docs or the web. Baseline for A+ tools is 194 chars average with complete WHAT/WHEN context.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Input parameter 'query' has minimal documentation (54 chars). Does not specify format, examples of valid queries, length limits, or whether it should be a Python module name (e.g. 'os'), function name (e.g. 'os.path.join'), or natural language search. Baseline for A+ tool params is 72 chars with complete guidance.
No pagination support despite returning search results. If multiple results are available, there is no mechanism to fetch additional results or limit result size. Results could be truncated or massive, wasting context. Pattern:paginated-result requires limit and page/offset for list-returning tools.
Error handling returns raw error text ('Error: [error.message]') without recovery guidance. When brave-search fails or returns unexpected format, the LLM gets 'Error searching for documentation: ...' with no actionable next steps. Pattern:recovery-guide requires errors to suggest corrective actions.
Hard dependency on external service (brave-search) with no fallback, timeout, or circuit breaker. Tool will always fail if brave-search is unavailable, and agent has no recovery path. No timeout explicitly set, so hung API calls will block the agent indefinitely.
Type safety issue: arguments validation uses 'any' cast and manual type guard ('isValidGetPythonDocsArgs'). While basic validation exists, the actual implementation casts (server as any) and invokes a method that does not exist in the SDK. This indicates broken implementation intent.