46 of 57 tools (81%) have NO visible input schema in source code. Schema score is 0 for these tools. Tools like mcp_stripe_*, mcp_github_*, mcp_memory_*, mcp_market_*, and mcp_trading_* are defined only by name and description.
Add explicit, comprehensive input schemas for all 46 tools currently missing them. Each tool must declare required/optional parameters with type (string, number, array, enum) and constraints (min/max, length, regex pattern).
Rewrite descriptions using 50-200 character LLM-optimized format. Pattern: 'What does it do? When to use it vs. similar tools? What does it return?' Example: 'Get account balance for a specific account ID. Use this after searching accounts to retrieve current funds. Returns: account_id, balance, currency, updated_at.'
Add parameter descriptions to every input. Example for 'mcp_financial_get_transactions': 'start_date (required): ISO 8601 format YYYY-MM-DD; transaction_type (optional): enum [deposit, withdrawal, transfer, fee]; limit (optional, default 20, max 100): number of results.'
Document output schemas for all tools. Example: 'Returns object: {account_id: string, balance: number (cents), currency: string (ISO code), updated_at: ISO 8601 timestamp}.'
Add dry-run or confirmation steps for destructive operations. Example: 'mcp_stripe_cancel_subscription' should support a 'dry_run: true' parameter and return simulation results before confirming permanent cancellation.
Implement error recovery guidance. Example: 'If account_id not found, call mcp_financial_search_accounts(partial_name) first. Returns 404 if account does not exist, try alternative account names.'
Add MCP security annotations. Declare permission requirements: mcp_stripe_* require 'write:stripe|read:stripe', mcp_trading_* require 'write:trading', etc. Implement role-based access control visible in tool definitions.
Tool descriptions are placeholder text ('Simulating X', 'Create a X', 'Get X') providing zero LLM guidance on WHEN to use the tool vs. similar tools. 50 of 57 tools have descriptions under 50 characters or trivial wording. LLMs cannot distinguish between 'Get financial account', 'Get financial portfolio', 'Get financial transactions' without proper disambiguating descriptions.
Parameters lack descriptions or meaningful guidance. E.g., 'list_dir' has empty input schema with no parameter details. 'mcp_financial_get_transactions' lists parameters (account_id, start_date, end_date, transaction_type) but source code lacks descriptions for date formats, allowed values, or field meanings. LLMs cannot determine what values are valid.
NO output schemas are documented for any tool. LLMs cannot plan downstream tool calls or extract necessary fields from responses. This violates the requirement that 100% of A-tier tools have documented return types.
Destructive and high-risk operations (mcp_stripe_cancel_subscription, mcp_stripe_create_refund, mcp_trading_place_order, mcp_memory_delete_entity, write_file) have NO dry-run, confirmation, or recovery guidance. Agents can execute irreversible actions without safeguards.
No error handling guidance. Tools do not return recovery hints ('If user not found, try search_*()'), error categories (retryable vs. fatal), or actionable corrections. LLMs cannot self-recover from failures.
No permission declarations or security scope annotations. Tools like mcp_stripe_* and mcp_trading_place_order do not declare required permissions (e.g., 'read:stripe', 'write:trading'). No audit trail or permission gates visible in tool definitions.
Naming inconsistencies and poor disambiguation. 'updateSubscription' (camelCase) breaks verb_noun convention used elsewhere. Multiple read-only financial tools (get_account, get_portfolio, get_transactions, get_balance) lack WHAT info they surface, LLM must guess which to call first.
Standardize naming: use verb_noun convention (list_subscriptions, not updateSubscription). Remove ambiguous generic names. Ensure tool names clearly distinguish intent (get_account vs. get_portfolio vs. get_balance).
Implement pagination for list tools. Example: 'mcp_github_list_pull_requests' should accept page (default 1), limit (default 20, max 100), and return total_count and next_cursor for continued traversal.
Add tool composition guidance. Document which tools chain together: 'After calling mcp_financial_get_account(account_id), use returned account_id in mcp_financial_get_portfolio(account_id) to fetch holdings.'
Implement idempotency keys for write operations. Example: 'mcp_stripe_create_invoice' should accept optional idempotency_key to prevent duplicate invoices on retry.'
Strip API response metadata. Return only fields agents need. Do not expose pagination internals, timestamps, or audit fields that waste tokens and dilute signal.