MCP (Model Context Protocol) proxy/router that sits in front of a fleet of downstream MCP servers and exposes only a handful of meta-tools (search_tools, describe_tool, call_tool, list_servers) to the host instead of every downstream tool definition — cutting context-window token usage by 80-95% for hosts connected to many MCP servers.
mcp-lens defines 4 meta-tools with clear verb-noun naming (search_tools, describe_tool, call_tool, list_servers). All tools have descriptions (194 - 250 chars, within baseline 34 - 392 range) and explicit Zod schemas with typed parameters. Descriptions explain WHAT each tool does and WHEN to use it (e.g., 'Use this before call_tool to discover which server/tool to use'). However, output schemas are not documented, responses are wrapped as JSON text without formal schema declarations. Error handling is present (toErrorResult) but lacks recovery guidance (e.g., 'Call search_tools first to find valid names' is mentioned in describe_tool but not systematized). Parameter descriptions are adequate but could be more prescriptive about constraints (e.g., limit max=50 is enforced but not explained in the description text itself).
Call a tool on a downstream MCP server through the mcp-lens proxy and return its result. Find server/tool names with search_tools first.
Get the full input schema and description for one specific downstream tool, identified by the server and tool names returned by search_tools.
List every downstream MCP server connected through mcp-lens, with its tool count.
Search the catalog of tools available across every connected downstream MCP server and return the best-matching tools for a free-text query. Use this before call_tool to discover which server/tool to use.
Output schemas not documented. Tools return JSON-wrapped text (toTextResult) without declaring the structure of results (e.g., search_tools returns array of {name, server, tool, description, inputSchema, score}, but this is not formally documented for LLM planning).
Error handling lacks recovery guidance. describe_tool returns 'Unknown tool' error but does not systematically guide the LLM on next steps (e.g., 'Call search_tools() with a partial tool name'). call_tool may fail silently if the downstream server is unreachable.
Parameter constraint 'limit max=50' is enforced in Zod but not explained in the description text. LLMs cannot read JSON Schema constraints, they rely on description text to understand bounds.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
call_tool 'arguments' parameter is optional and accepts any object (z.record(z.string(), z.unknown())). No guidance on what happens if required downstream parameters are omitted, or how to handle validation errors from the downstream tool.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). search_tools, describe_tool, and list_servers are read-only; call_tool is destructive. Annotations would help LLMs reason about safety and retry logic.