MCP elicitation: capability is declared but requests are auto-declined ("print mode") in interactive VSCode sessions
Summary
In an interactive VSCode-extension session, Claude Code declares the MCP elicitation capability during initialize, but auto-declines every elicitation/create request without showing any UI. The same session can render permission prompts and AskUserQuestion option dialogs, so it is clearly capable of interactive prompting — only the MCP elicitation path is unwired and silently rejected.
Because the capability is declared, servers cannot detect the situation:
ServerSession.check_client_capability(ClientCapabilities(elicitation=...))returnstruectx.elicit(...)does not raise; it returns a normal non-accept result- From the server's perspective this is indistinguishable from a human explicitly declining the dialog
Impact
Any MCP server that implements a two-phase destructive operation ("show dialog → proceed on accept, abort on decline") dead-ends: the auto-decline is interpreted as a user cancellation, and the operation becomes impossible from Claude Code while working fine from elicitation-capable clients (e.g. Claude Desktop). We had to patch our server to treat decline as "declined or unavailable" and fall back to a confirmation-token flow, which weakens the semantics of a real user decline for every other client.
Repro
- Minimal Python MCP stdio server (FastMCP /
mcpSDK) with a tool that callsctx.elicit(message=..., schema=...). - Register it in
.mcp.json, run a Claude Code session from the VSCode extension. - Ask Claude to call the tool.
- The tool returns immediately with a non-accept elicitation result; no dialog is shown.
MCP log (~/Library/Caches/claude-cli-nodejs/<project>/mcp-logs-<server>/*.jsonl):
{"debug":"Elicitation request received in print mode: {\"method\":\"elicitation/create\",\"params\":{\"mode\":\"form\", ... }}", ...}
Note the log says "print mode" even though the session is interactive (permission prompts and AskUserQuestion render fine in the very same session).
Expected behavior (any of these would fix it)
- Do not declare the
elicitationcapability in session types that will not render elicitation UI — thencheck_client_capabilitylets servers fall back cleanly; or - Render elicitation via the same prompt surface already used for permission prompts / AskUserQuestion in these sessions; or
- Respond with a distinguishable error (e.g. method-not-supported) instead of a synthetic decline, so servers can tell "client cannot ask" apart from "user said no".
Environment
- Claude Code 2.1.41 (VSCode extension, VSCode 1.129.0)
- macOS 26.5 (darwin)
- MCP server: Python
mcpSDK / FastMCP, stdio transport
Showing cached comments. Read the full discussion on GitHub ↗
4 Comments
+1 on this, i just added elicitation to an mcp server for data mutation operations, i would prefer one of the options where this will work in interactive vs code mode
+1 on this from here as well!
Env
Adding a fresh repro from an agentic (headless) setup — same root cause, different surface.
Setup: a Rust MCP server (
rmcp3.1.2) bridging Claude Code sessions into a peer network. On WS connect, the server callspeer.elicit::<T>(message)(server→clientelicitation/create).Claude Code v2.1.227 advertises the capability at
initialize:…but every request is auto-declined ~400ms later, with no user interaction:
100% of the time, on freshly-connected sessions. Same symptom as this issue and #84207.
Why this matters beyond the surface UI bugs. The capability is advertised, so servers build against it — and then hit a uniform silent dismissal. Advertising a capability that is always rejected is strictly worse than not advertising it: it turns an honest "not supported" into "supported, but lies." We were using server→client elicitation as a liveness/wake signal for agentic sessions, precisely because the client declared it.
This has been open since July 24 — it's now August 11, still unfixed. For a team that champions the MCP spec and interoperability, honoring your own advertised capabilities (or not advertising them) should be table stakes. Please either implement
elicitationfor non-interactive / agentic clients, or drop it fromClientCapabilitieswhen the client will always decline.Reproducing this with a remote (claude.ai-managed) MCP server, not a local stdio server — and it's 100% reproducible, not intermittent.
Environment: Claude Code 2.1.228, VSCode extension
anthropic.claude-code@2.1.228, Windows 11 Pro (26200).Setup: remote MCP server connected as a claude.ai connector; some of its tools issue an
elicitation/createrequest while handling a call.Symptom: in a VSCode extension session, every tool call that triggers an elicitation fails instantly — the server receives a decline without any dialog ever being rendered (3/3 such calls in the same session), while native permission prompts in that same session render fine. As described in the OP, from the server side this is indistinguishable from a real human decline.