MCP elicitation: capability is declared but requests are auto-declined ("print mode") in interactive VSCode sessions

Status Open
Reported on v2.1.41
Maintainer reply None cached
Activity 5 comments · opened Jul 19, 2026

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=...)) returns true
  • ctx.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

  1. Minimal Python MCP stdio server (FastMCP / mcp SDK) with a tool that calls ctx.elicit(message=..., schema=...).
  2. Register it in .mcp.json, run a Claude Code session from the VSCode extension.
  3. Ask Claude to call the tool.
  4. 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)

  1. Do not declare the elicitation capability in session types that will not render elicitation UI — then check_client_capability lets servers fall back cleanly; or
  2. Render elicitation via the same prompt surface already used for permission prompts / AskUserQuestion in these sessions; or
  3. 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 mcp SDK / FastMCP, stdio transport

View original on GitHub ↗

4 Comments

chris-cummings · 1 month ago

+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

sailingKieler · 1 month ago

+1 on this from here as well!

Env

koshak01 · 19 days ago

Adding a fresh repro from an agentic (headless) setup — same root cause, different surface.

Setup: a Rust MCP server (rmcp 3.1.2) bridging Claude Code sessions into a peer network. On WS connect, the server calls peer.elicit::<T>(message) (server→client elicitation/create).

Claude Code v2.1.227 advertises the capability at initialize:

ClientCapabilities { ..., elicitation: Some(ElicitationCapability { form: None, url: None }) }

…but every request is auto-declined ~400ms later, with no user interaction:

error = "User cancelled/dismissed the request"

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 elicitation for non-interactive / agentic clients, or drop it from ClientCapabilities when the client will always decline.

ArtRodriguez · 19 days ago

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/create request 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.

Showing cached comments. Read the full discussion on GitHub ↗