MCP deferred tool loading returns empty parameter schemas, breaking parameterized tools

Resolved 💬 3 comments Opened Mar 16, 2026 by dhasson04 Closed Mar 20, 2026

Bug Description

When MCP tools are loaded via deferred tool loading (ToolSearch), the returned schemas have empty properties: {} regardless of the actual inputSchema defined by the MCP server. This causes all parameters passed to MCP tools to be stripped before reaching the server, making any tool that requires parameters unusable.

Steps to Reproduce

  1. Create an MCP server that registers tools with inputSchema containing required parameters (e.g. task_id: { type: 'string' })
  2. Connect it to Claude Code via .mcp.json
  3. When Claude invokes the tool via deferred loading, ToolSearch returns:

``json
{"name": "mcp__my-server__get_task", "parameters": {"properties": {}, "type": "object"}}
``

  1. Any parameters passed in the tool call are stripped — the MCP server receives an empty params object

Expected Behavior

ToolSearch should return the full inputSchema from the MCP server's tool registration, e.g.:

{
  "name": "mcp__my-server__get_task",
  "parameters": {
    "type": "object",
    "properties": {
      "task_id": { "type": "string", "description": "Task UUID" }
    },
    "required": ["task_id"]
  }
}

Actual Behavior

  • ToolSearch always returns "properties": {} for MCP tools
  • Parameters are silently dropped
  • The MCP server receives empty params, causing downstream failures
  • Tools that don't require parameters (e.g. list_tasks) work fine, masking the issue

Impact

  • All parameterized MCP tools are broken — get, update, delete, move operations all fail
  • Only parameterless tools (list operations) work
  • Workaround: bypass MCP tools entirely and use direct API calls via curl

Environment

  • Claude Code CLI
  • MCP server using @modelcontextprotocol/sdk with stdio transport
  • Tools registered via server.tool() with standard JSON Schema inputSchema

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗