Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jan 16, 2026

Clients were wrapping tool parameters in a "data" field (e.g., {"arguments":{"data":{"body":"...)) because the gateway was omitting inputSchema` from tools/list responses. Without schema information, clients couldn't understand parameter structure.

Root Cause

The gateway intentionally omitted inputSchema when registering tools to avoid JSON Schema version conflicts (draft-07 from backends vs draft-2020-12 required by SDK validation). This left clients unable to parse tool parameter requirements.

Changes

Switch to non-validating tool registration:

  • Use server.AddTool (method, no validation) instead of sdk.AddTool (function, validates)
  • Include inputSchema from backends regardless of JSON Schema version
  • Apply consistently across unified and routed modes

Handle missing schemas:

  • NormalizeInputSchema now provides default empty object schema when backend returns nil
  • Satisfies SDK requirement that inputSchema must exist with type "object"

Example

Before (tools/list response):

{
  "tools": [{
    "name": "create_output",
    "description": "Create an output"
    // inputSchema missing - client guesses wrong
  }]
}

After:

{
  "tools": [{
    "name": "create_output",
    "description": "Create an output",
    "inputSchema": {
      "type": "object",
      "properties": {
        "body": {"type": "string"}
      }
    }
  }]
}

💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI and others added 5 commits January 16, 2026 19:50
Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
- Changed from sdk.AddTool (validates schema) to server.AddTool (no validation)
- This allows including InputSchema from backends using different JSON Schema versions
- Updated NormalizeInputSchema to provide default empty object schema when backend provides none
- Updated test to verify nil schemas get normalized to empty object schema
- All tests pass

This fixes the issue where clients were wrapping parameters in "data" field because they didn't understand the tool parameter structure.

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
- Apply same fix to routed mode for consistency
- Add safe type assertion in test to prevent potential panic
- Format code

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
- Add nil check before type assertion in test
- Clarify comment about handler parameter usage
- Format code

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
Copilot AI changed the title [WIP] Verify correct exposure of safeoutputs tools to clients Fix: Include inputSchema in tools/list responses to prevent client parameter wrapping Jan 16, 2026
Copilot AI requested a review from lpcox January 16, 2026 20:03
@lpcox lpcox marked this pull request as ready for review January 16, 2026 21:29
@lpcox lpcox merged commit d3bc69c into main Jan 16, 2026
3 checks passed
@lpcox lpcox deleted the copilot/check-safeoutputs-exposure branch January 16, 2026 21:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants