MCP HTTP+OAuth fails: Claude Code sends unrecognised 'elicitation.form' capability field causing -32603 on older Java MCP SDKs

Resolved 💬 2 comments Opened Mar 17, 2026 by mihaitaradu-coder Closed Apr 14, 2026

Summary

Claude Code fails to connect to an MCP server over HTTP+OAuth. The server rejects the initialize handshake with -32603 because Claude Code's payload includes capabilities.elicitation.form — a field the server-side Java MCP SDK doesn't recognise.

Environment

  • Claude Code version: 2.1.77
  • Platform: Raspberry Pi 4 (aarch64), Debian 12 (bookworm), kernel 6.12.75+rpt-rpi-v8
  • MCP transport: type: "http" with OAuth (authorization_code + refresh_token)
  • MCP server: Seller Labs — https://ignite-api.sellerlabs.com/mcp

Error in ~/.claude/debug/latest

2026-03-17T15:20:47.858Z [DEBUG] MCP server "sellerlabs": HTTP Connection failed after 849ms: MCP error -32603: Unrecognized field "form" (class io.modelcontextprotocol.spec.McpSchema$ClientCapabilities$Elicitation), not marked as ignorable (0 known properties: ])
 at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: io.modelcontextprotocol.spec.McpSchema$InitializeRequest["capabilities"]->io.modelcontextprotocol.spec.McpSchema$ClientCapabilities["elicitation"]->io.modelcontextprotocol.spec.McpSchema$ClientCapabilities$Elicitation["form"])

2026-03-17T15:20:47.860Z [ERROR] MCP server "sellerlabs" McpError: MCP error -32603: Unrecognized field "form" ...
2026-03-17T15:20:47.902Z [ERROR] MCP server "sellerlabs" Connection failed: MCP error -32603: Unrecognized field "form" ...

Proof the server works fine (curl)

A minimal initialize (without the elicitation.form field) returns HTTP 200 successfully:

curl -s -X POST "https://ignite-api.sellerlabs.com/mcp" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "method": "initialize",
    "params": {
      "protocolVersion": "2024-11-05",
      "capabilities": {},
      "clientInfo": {"name": "test", "version": "1.0"}
    },
    "id": 1
  }'

Response (HTTP 200):

{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"completions":{},"prompts":{"listChanged":false},"resources":{"subscribe":false,"listChanged":false},"tools":{"listChanged":false}},"serverInfo":{"name":"sellerlabs-database-server","version":"0.0.1"}}}

OAuth token is valid, refresh flow works — transport and auth are confirmed working. Only Claude Code's initialize payload triggers the failure.

/mcp status shown to user

Failed to reconnect to sellerlabs.

No visible error — only discoverable via CLAUDE_DEBUG=1 and reading ~/.claude/debug/latest.

Analysis

Claude Code is sending an initialize payload that includes:

{
  "capabilities": {
    "elicitation": {
      "form": ...
    }
  }
}

The form field was added to the MCP spec in a newer protocol version. The Seller Labs server's Java MCP SDK uses Jackson configured to fail on unknown fields (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES = true), which causes it to return -32603 and abort the connection.

Suggested fixes

  1. Protocol negotiation — only include elicitation.form in capabilities when the server has declared support for the protocol version that introduces it
  2. Graceful fallback — on -32603 during initialize, retry with minimal capabilities (progressive enhancement)
  3. Better user-facing error/mcp should surface the actual error message, not just "Failed to reconnect"

Config (redacted)

{
  "mcpServers": {
    "sellerlabs": {
      "type": "http",
      "url": "https://ignite-api.sellerlabs.com/mcp",
      "oauth": {
        "authorizationUrl": "https://ignite-api.sellerlabs.com/oauth2/authorize",
        "tokenUrl": "https://ignite-api.sellerlabs.com/oauth2/token",
        "scopes": ["openid", "mcp", "offline_access", "execute_sql", "get_org_info"],
        "clientId": "<redacted>"
      }
    }
  }
}

View original on GitHub ↗

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