Severe tool duplication: 3 identical 'SearchAsync', 'GetAllServersAsync', and 'GetServerDetailsAsync' triplets across CachedServerRegistry, McpServersComRegistry, and MockServerRegistry. LLMs cannot disambiguate which registry to query and will reason inefficiently through multiple similar tools.
Generic tool names 'SearchAsync' and 'GetAllServersAsync' do not follow verb_noun pattern or disambiguate source. Names should reflect registry context: 'search_cached_servers', 'search_mcp_servers_com', 'get_mock_servers'. Current names violate naming uniqueness and clarity rules.
Consolidate duplicate tools across registries. Create a single 'search_servers' tool with a 'source' parameter (enum: cached, mcp-servers-com, mock) rather than three parallel implementations. This reduces cognitive load and eliminates ambiguity.
Rename generic SearchAsync/GetAllServersAsync to canonical names reflecting source: 'search_servers' with 'source' parameter, or separate tools 'search_cached_servers', 'search_mcp_registry_servers'. Use clear, contextual names.
Document return types for all tools. For SearchServersAsync, explicitly state it returns {servers: [{id, name, description, downloadCount, ...}], totalCount, page, totalPages}. For GetServerHealthAsync, state it returns {serverId, isRunning, isHealthy, lastChecked, uptime, errorMessage?}.
Expand parameter descriptions for complex objects. For InstallServerAsync 'server' param, document structure: 'McpServer object with required fields: id (string, unique identifier), name (string, 1-256 chars), command (string, CLI command), arguments (string array, optional). Validate id format before installation.'
Add error handling guidance to destructive tools. UninstallServerAsync should document: 'Returns error if server not found. Verify server is not running before uninstall to avoid orphaned processes. Use IsServerRunningAsync first if unsure.'
Implement confirmation pattern for UninstallServerAsync. Add optional 'confirm' boolean parameter (default false). When false, return {status: 'preview', willDelete: {serverId, name, installedAt}} so agent can confirm before setting confirm=true.
Output schemas not documented in tool definitions. Tools return complex objects (ServerBrowseResult with nested ServerSearchResult array, ServerHealthStatus, McpServer, etc.) but no return type documentation visible. LLMs cannot plan downstream tool calls without knowing returned fields.
Complex object parameters lack detailed field descriptions. 'InstallServerAsync' accepts 'server' parameter of type 'object' with description 'McpServer object containing server information', does not specify required fields, nested structure, or validation constraints. 'UpdateServerConfigurationAsync' accepts 'configuration' as 'Dictionary<string, string>' with minimal guidance on valid keys.
No error handling or recovery guidance visible in tool definitions. No indication of what errors each tool can return, whether operations are retryable, or what recovery steps are available. Critical for agents making multi-step decisions.
Destructive operations lack confirmation or dry-run patterns. 'UninstallServerAsync' directly deletes without offering confirmation or preview. Agents should be able to preview impact before committing destructive changes.
Tool descriptions are inconsistent in detail. SearchServersAsync has a detailed 194-character description with parameter explanations; GetServerByIdAsync has only 34 characters. Inconsistency signals incomplete documentation and reduces LLM's ability to select tools correctly.
No pagination limits enforced in GetAvailableCategoriesAsync or GetRegistriesAsync. These tools return unbounded result sets (all categories, all registries). If there are thousands of categories or registries, responses could exhaust context window.
No parameter type specifications visible for 'server' object in InstallServerAsync or 'configuration' dict in UpdateServerConfigurationAsync. Parameters lack JSON Schema type/format constraints and validation rules.
InstallServerAsyncUpdateServerConfigurationAsync
Add pagination support to GetAvailableCategoriesAsync and GetRegistriesAsync. Include 'limit' parameter (default 50, max 500) and 'offset' parameter. Return {categories: [...], total, limit, offset} to prevent context window exhaustion.
Specify sortBy enum for SearchServersAsync. Instead of string with 'default: downloads', use enum: ['downloads', 'recent', 'name', 'score'] with description 'One of: downloads (most downloaded), recent (latest updated), name (alphabetical), score (rating)'.
Add input validation rules to descriptions. For SearchServersAsync pageSize, document: 'Number of results per page, range 1-100. Defaults to 12. Values outside range will be clamped.'
Document chaining relationships. SearchServersAsync should note 'Returns serverId field; pass to GetServerByIdAsync for details or InstallServerAsync to install.' This guides agent planning.
Add security considerations if credentials are involved. Document any API keys, tokens, or authentication required for external registries (MCPServers.com). Confirm these are injected server-side, not exposed as parameters.
Create batch installation variant. Add 'install_servers_batch' accepting array of serverIds to prevent loop-based sequential installs. This reduces token usage and latency for bulk operations.