MCP HTTP+OAuth fails: Claude Code sends unrecognised 'elicitation.form' capability field causing -32603 on older Java MCP SDKs
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
- Protocol negotiation — only include
elicitation.formin capabilities when the server has declared support for the protocol version that introduces it - Graceful fallback — on
-32603duringinitialize, retry with minimal capabilities (progressive enhancement) - Better user-facing error —
/mcpshould 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>"
}
}
}
}This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗