Features
Complete catalog of what MR Multi Model AI Coder does today. Every feature listed here is wired up and tested.
Providers & Routing
9 AI backends behind a unified interface. Full model tables and setup guides in the Providers documentation.
| Provider | Auth | Transport | Free? |
|---|---|---|---|
| Claude | API key | Agent SDK | Paid |
| MR Coder | OAuth connect | Agent SDK | With subscription |
| Kilo Code | CLI OAuth | Subprocess | 9 free models |
| Qwen | API key or CLI | SSE / Subprocess | Free trial |
| OpenRouter | API key | HTTPS SSE | 16 free models |
| Ollama | None | Localhost | Free forever |
| OpenAI Codex | API key or CLI | SSE / Subprocess | Paid (free trial) |
| Google Gemini | API key or CLI | SSE / Subprocess | Free tier |
| HuggingFace | HF token | HTTPS SSE | Free tier |
- -Provider lock per session — the provider chosen on the first turn sticks for the life of that chat tab.
- -Hot-swap provider or model mid-conversation — click a different chip, transcript replays automatically.
- -Availability probing — Ollama chip probes with a 2-second timeout so the chip reflects live status.
- -Preflight mismatch detection — pasting wrong key types triggers clear error messages.
Chat Experience
- -Multi-tab chats — every conversation is a real VS Code editor tab. Drag, split, pin, close independently.
- -Three entry points to start a chat: sidebar button, editor title bar icon, and status bar entry.
- -Streaming responses with a three-dot indicator and an immediate stop button.
- -Up/Down arrow cycles through previous prompts (terminal-style). Draft is preserved.
- -Enter sends, Shift+Enter inserts a newline. IME composition respected.
- -Auto-scroll pauses when you scroll up. A 'Jump to latest' button appears for new content.
- -Per-message actions on hover: Copy, Edit & resend, Regenerate.
Markdown Rendering
- -Assistant messages render as real Markdown — fenced code blocks, inline code, bold, italic, headings, lists, blockquotes, links.
- -Code blocks have a one-click Copy button with a success checkmark.
- -Safe React-element renderer — no dangerouslySetInnerHTML, no XSS surface.
Agentic Loop (Tool Approvals)
Every tool the model wants to run goes through a typed approval flow with visual feedback.
| Tool | Display | Default Mode |
|---|---|---|
| Read / Grep / Glob | Compact summary | Auto-allowed |
| Edit / Write / MultiEdit | Inline unified diff | Prompt |
| Bash / BashOutput | Command in monospace | Prompt |
| Custom / MCP tools | Name + input preview | Prompt |
- -Inline diff shows before/after at the line level with compressed unchanged runs.
- -Open side-by-side VS Code diff editor if you prefer.
- -Tool message rows collapse to a single line with click to expand.
- -Long tool outputs collapse past 24 lines with a 'Show more' toggle.
- -TodoWrite renders as a live checklist with in-progress and completed states.
Attachments
- -@file mentions in the composer with fuzzy case-insensitive workspace search.
- -@terminal mention attaches the active terminal's last-command output.
- -Paperclip button opens the native OS file picker — multi-select from any drive.
- -Shift+drop files from VS Code file explorer or OS.
- -Paste screenshots (Ctrl+V) — saved locally and auto-attached.
- -Click attachment chip to preview; x button to remove before sending.
- -Auto-attach editor selection setting — selected code gets inlined in the message.
- -Validation: binary files rejected, files over 10 MB blocked, files over 1 MB prompt confirmation.
Sessions, Checkpoints & Rewind
- -Persistent sessions saved locally — restorable from the sidebar.
- -Automatic per-turn checkpoints before any Edit/Write/MultiEdit.
- -Rewind via the rewind icon on any user message — Fork, Restore, or Both.
- -Past Conversations picker with date buckets and metadata.
- -Carry-over summary with /fork <summary> to seed new sessions.
Context Management
- -Auto-compact fires when context window crosses the threshold (default 80%).
- -Context replay on provider/model switch — recent turns prepended as transcript.
- -Adaptive replay size auto-scales to the target model's context window.
- -Live context readout below the composer — input/output tokens, context %, cost.
Scheduled Messages
Schedule a message to fire at a specific time — useful for long tasks, follow-up prompts, or timed reminders.
/schedule → guided flow
/schedule refactor the auth → skips message prompt
/schedule list → view pending schedules
/schedule cancel <id> → cancel a scheduleIf VS Code is closed when the scheduled time passes, a notification shows what was missed with Send Now / Reschedule / Delete options.
Voice (Read Aloud)
Every reply has a play button that reads it aloud. Code blocks are summarised (“Code block in TypeScript, 12 lines”) instead of read out. Links are read by their label and file paths by their file name; markdown symbols and emoji are skipped. Stop Reading Aloud in the command palette stops playback.
/autospeak on → read each reply of THIS chat aloud when it finishes
/autospeak off → stop auto-play in this chat (play buttons still work)
/autospeak status → whether this chat auto-plays, and which voice is usedVoices: Deepgram Aura-2 with your own Deepgram API key, or the free system voice. Add the key in Settings → Speech to Text & Text to Speech → Deepgram settings. It is stored with your other credentials, never in settings.json. Deepgram bills per character.
Voice Input (Speech to Text)
Push-to-talk: click the microphone in the chat composer (or press Ctrl+Alt+V, ⌘⌥V on macOS), speak, and click again. The words are inserted where the cursor is, for you to review before sending. Esc cancels. Speech to text uses Deepgram Nova-3 with your own Deepgram API key.
Wake word:say “hello coder” followed by your request and it is sent hands-free — or say “hello coder” alone, wait for the chime, then the request. A request spoken while a reply is still being written is added to that turn, like a typed one.
/hello-coder on → turn the wake word on and start listening in this window
/hello-coder off → turn it off and close the microphone
/hello-coder status → whether it is on, and whether this window is listeningPrivacy and cost: listening never starts by itself — after a reload, press Start listening in the composer. While listening, speech is detected on your machine and only what you say is sent to Deepgram (billed by audio length); replies being read aloud are ignored. The status bar shows when the microphone is listening. Desktop VS Code records with the system microphone (built in on Windows; SoX on macOS; arecord, SoX or ffmpeg on Linux). In web access the browser records — this needs an HTTPS address and your permission.
Cost & Usage
Every turn reports token usage — input, output, and cache reads/writes — plus an estimated cost for the turn and a running total for the session. Cache reads are shown separately because they are billed at a fraction of fresh input.
/cost → this session's tokens and estimated cost
/usage → MR Coder token usage (rolling window, weekly, monthly)The context meter in the chat header shows how much of the model's window is in use, so you can see compaction coming before it happens.
Web Remote Access & Tunnel
Open your workspace from any browser. Opt-in via mrMultiCoder.webAccess.enabled.
- - Two-port design: an auth proxy in front, the VS Code Server internal-only behind it
- - JWT session cookies, bcrypt-hashed passwords, brute-force rate limiting
- - Per-user project permissions — restrict a user to specific folders
- - Extension allowlist enforced by VS Code 1.96+
- - Optional Cloudflare tunnel for a public domain
Full setup and the security model in the Web Remote Access guide.
MCP Servers (Model Context Protocol)
Connect external tools and endpoints from a visual modal — type /mcp in any chat, or use the MCP button in the composer. API keys go to your OS keychain, never to settings.json.
| Preset | Auth | What you get |
|---|---|---|
| Jira (Atlassian) | Email + API token (Basic) | Projects, epics, stories, tasks and issues |
| Figma | OAuth or Personal Access Token | Design tokens, components, frames → code |
| Stitch | API key | List projects, generate screens → code |
| Anthropic Compatible | API key (x-api-key) | Any /v1/messages gateway, as a chat provider |
| OpenAI Compatible | API key (Bearer) | Any /chat/completions gateway, as a chat provider |
| Custom Server | Pick your own header | Any MCP server reachable over HTTP |
Jira scopes per question, not per connection. There is no project picker — Jira exposes no project-scoping header, so you narrow in the chat instead: “list my Jira projects” → “epics in PROJ” → “what's under PROJ-42?” to reach its stories and tasks. You only ever see what your Atlassian account can already see.
Servers are stored in mrMultiCoder.mcpServers — the same shape as Claude Code's config. Chat-capable endpoints (Anthropic/OpenAI Compatible) appear in the provider chip; tool servers stay in the tool plumbing.
Project Conventions (CODER.md)
Run /init to launch a wizard that asks seven questions and writes a single CODER.md at the repo root. It gets wired into every provider's memory file automatically.
- -Max lines per file, tech stack, testing policy, comment style, commit style, dependency policy, off-limits paths.
- -Idempotent — re-running /init never duplicates the reference block.
- -CODER.md is loaded first in the auto-memory chain across all providers.
Security & Workspace Trust
- -API keys live only in your OS secure keychain — never in configuration files, never synced, never logged.
- -Workspace trust respected end-to-end — edit, write, and bash tools refuse to run in untrusted workspaces.
- -CLI providers are never bundled — auto-detected on PATH with install hints.
- -Proposed-content store is session-scoped and automatically cleaned up.
Developer Analytics Dashboard
A full-featured, self-contained analytics dashboard for tracking productivity, cost, and reliability. Full specification in the Analytics documentation.
- -Productivity Score (0-100) with five weighted components.
- -12 KPI cards with period-over-period deltas.
- -Streak tracking, peak hours, efficiency trends, session quality.
- -Cost intelligence — daily trends, cost per prompt, cost by project/provider.
- -Model productivity ranking table.
- -Export to CSV or JSON. All data is local-only.
Settings Reference
All 97 settings, prefixed with mrMultiCoder. Open them with MR Multi coder: Open Settings or search the prefix in VS Code settings.
| Setting | Default | Description |
|---|---|---|
provider | claude | Active backend provider for new sessions. |
claude.backend | anthropic | Routing backend for the Claude provider. |
claude.endpoint | (empty) | Override the Claude API endpoint |
claude.credentials | [] | Claude credential profiles that coexist (real Anthropic key, qoder, etc.) |
claude.activeCredentialId | (empty) | Which Claude credential profile is active for new sessions |
claude.model | claude-sonnet-4-6 | Default Claude model for new Claude-provider sessions |
mrcoder.model | claude-sonnet-4-6 | Default model for MR Coder sessions |
kilo.cliPath | kilo | Path to the Kilo Code CLI binary |
kilo.model | (empty) | Model identifier passed to the Kilo CLI |
iflow.cliPath | iflow | Path to the iFlow CLI binary |
iflow.model | (empty) | Model identifier passed to the iFlow CLI. |
qwen.authMode | api | How to reach Qwen |
qwen.cliPath | qwen | Path to the Qwen CLI binary (CLI auth mode only). |
qwen.endpoint | https://dashscope.aliyuncs.com/compatible-mode/v1 | Base URL for the OpenAI-compatible /chat/completions endpoint |
qwen.model | qwen3-coder-plus | Default Qwen model identifier sent as the model field in chat-completion requests |
openrouter.model | nvidia/nemotron-3-super-120b-a12b:free | Default OpenRouter model |
ollama.endpoint | http://localhost:11434/v1 | Ollama's OpenAI-compatible endpoint |
ollama.model | qwen2.5-coder:7b | Default Ollama model tag |
codex.authMode | api | How to reach OpenAI: API mode (stored key) or CLI mode (spawn codex binary). |
codex.cliPath | codex | Path to the Codex CLI binary |
codex.endpoint | https://api.openai.com/v1 | OpenAI API base URL |
codex.model | o4-mini | Default OpenAI model |
gemini.authMode | api | How to reach Gemini: API mode (stored key) or CLI mode (spawn gemini binary). |
gemini.cliPath | gemini | Path to the Gemini CLI binary |
gemini.endpoint | https://generativelanguage.googleapis.com/v1beta/openai | Gemini API base URL (OpenAI-compatible endpoint) |
gemini.model | gemini-2.5-flash | Default Gemini model |
huggingface.endpoint | https://router.huggingface.co/hf-inference/v1 | HuggingFace Inference API base URL (OpenAI-compatible) |
huggingface.model | Qwen/Qwen2.5-Coder-32B-Instruct | Default HuggingFace model |
qoder.cliPath | qodercli | Path to the Qoder CLI binary |
permissionMode | default | Default permission mode for new sessions. |
allowedTools | [] | Tools to auto-approve regardless of permission mode. |
disallowedTools | [] | Tools to always deny |
approvalTimeoutSeconds | 0 | Seconds to wait for user approval before auto-denying a tool call |
maxTurns | 1000 | Maximum number of agent turns per session before forcing a stop |
maxAutoContinue | 5 | When a response is truncated (output limit, turn limit, or incomplete tool loop), automatically send a 'Continue' follow-up up to |
maxToolRounds | 0 | Maximum tool-call rounds per turn before the loop is stopped |
customSystemPrompt | (empty) | Additional instructions appended to the system prompt for every session. |
autoCompactThreshold | 0.7 | Context usage fraction (0.0–1.0) at which to auto-compact the conversation |
sizeCompactThreshold | 2000 | Trigger auto-compact when the session exceeds this many stored messages (regardless of context-window usage). |
contextStrategy | rolling-summary | How to condense long conversations so the CLI provider doesn't overflow its context window. |
rollingSummary.summarizeEveryNMessages | 25 | How many user messages to accumulate before the rolling summariser fires |
rollingSummary.keepRawAfterSummary | 10 | How many recent user turns (with their assistant/tool responses) to keep verbatim alongside the rolling summary after compact |
rollingSummary.summariserProvider | auto | Which provider runs the rolling-summary LLM call |
contextReplay.maxChars | 80000 | Maximum character budget for the context-replay prefix injected on session resume or provider swap |
contextReplay.maxMessages | 50 | Maximum number of messages to include in the context-replay prefix. |
contextReplay.perMessageCap | 4000 | Per-message character cap within the context-replay prefix |
toolResultTruncateBytes | 50000 | Truncate tool results larger than this many bytes to preserve context budget. |
loadProjectMemory | true | Auto-load CLAUDE.md / .mrcoder/MEMORY.md from the workspace into the system prompt. |
loadGlobalMemory | true | Auto-load ~/.mrcoder/MEMORY.md into the system prompt at session start. |
showMemoryInStatusBar | true | Show a status-bar chip with the loaded project-memory size |
sessionMemory.maxSummaries | 6 | Maximum number of compact summaries to keep in the per-session MEMORY.md file |
swapSummarise | auto | Whether to run an LLM summarisation when switching to a provider with a smaller context window |
showCostInStatusBar | true | Show running token usage and estimated cost in the status bar (Claude provider only). |
costCapUsdPerSession | 0 | Block sends after estimated session cost exceeds this many USD |
telemetry.enabled | false | Send anonymous usage telemetry to help improve MR Multi coder |
claude.extendedThinking | false | Enable Claude's extended thinking (server-side reasoning) |
claude.thinkingBudgetTokens | 32000 | Token budget for Claude's extended thinking when enabled |
po.enabled | false | Enable the Product Owner agent — an automatic 'second pair of eyes' that reviews each turn, lists pending tasks, and (when complet |
po.mode | passive | Product Owner behavior |
po.autoCommit | false | When enabled and files changed, auto-commit the AI model's work as 'MR CODER PO' (secret + off-limits-path safety gates always app |
po.model | (empty) | Model the Product Owner reviews with |
po.snapshotViewEnabled | true | Show the PO Snapshots view in the sidebar |
po.endpoint | (empty) | Optional URL the share-snapshot command POSTs to |
po.endpointToken | (empty) | Optional bearer token sent with snapshot uploads |
autoAttachSelection | false | When you send a message, automatically attach the active editor selection (if any) as a fenced code block. |
enableNewConversationShortcut | false | Enable Ctrl+N / Cmd+N to start a new conversation when the Conversations view is focused |
analytics.enabled | true | Enable or disable analytics data collection |
analytics.minutesPerTask | 5 | Estimated minutes saved per accepted AI suggestion |
analytics.refreshIntervalSeconds | 30 | Auto-refresh interval for the analytics dashboard in seconds |
analytics.goals.acceptanceRate | 0 | Target acceptance rate (%) |
analytics.goals.dailyPrompts | 0 | Target daily prompts |
analytics.goals.maxCostPerDay | 0 | Target max daily cost in USD |
analytics.goals.maxResponseTimeMs | 0 | Target max response time in ms |
tts.provider | deepgram | Voice that reads replies aloud: deepgram (your key; falls back to the system voice without one) or system. |
tts.voice | aura-2-thalia-en | Deepgram Aura-2 voice used to read replies aloud. |
tts.speed | 1 | Speaking rate for replies read aloud (0.7–1.5). |
tts.playButton | true | Show a play/stop button on each reply. |
tts.autoPlay | false | Deprecated and ignored — auto-play is per chat now: /autospeak on in the chat you want read aloud. |
stt.pushToTalk | true | Show the push-to-talk microphone button in the chat composer. |
stt.wakeWord | false | Turn on the wake word (same as /hello-coder on|off). Listening starts only when you start it in a window. |
stt.wakePhrase | hello coder | The words that wake the chat. |
stt.language | en | Speech-to-text language (BCP-47, e.g. en, en-GB, de; multi for mixed). |
stt.keyterms | [] | Words to recognise better — project names, jargon (English only, up to 50). |
hapticFeedback.enabled | true | Enable or disable haptic feedback sounds for chat events. |
hapticFeedback.volume | 0.95 | Master volume level for haptic feedback sounds (0 = silent, 1 = full). |
hapticFeedback.sounds.submit | (empty) | Absolute path to a custom sound file for message submit |
hapticFeedback.sounds.responseComplete | (empty) | Absolute path to a custom sound file for response completion |
hapticFeedback.sounds.question | (empty) | Absolute path to a custom sound file for AI asking a question (tool approval) |
hapticFeedback.sounds.error | (empty) | Absolute path to a custom sound file for error events |
hapticFeedback.sounds.taskComplete | (empty) | Absolute path to a custom sound file for task completion (refactor, generation with tools) |
hapticFeedback.keyboardSounds.enabled | true | Play typing sounds when pressing keys in the chat input. |
hapticFeedback.keyboardSounds.profile | electronic | Keyboard sound profile. |
hapticFeedback.onProgress.enabled | false | Enable ambient music playback while the AI is generating |
hapticFeedback.onProgress.folderPath | (empty) | Absolute path to a folder containing audio files (*.wav, *.mp3, *.ogg, *.m4a) for progress playback. |
hapticFeedback.onProgress.volume | 0.3 | Volume level for progress music (0 = silent, 1 = full). |
webAccess.enabled | false | Enable VS Code Web remote access |
webAccess.port | 18462 | Port for web remote access. |
webAccess.projectsFolder | (empty) | Root folder containing your projects |
webAccess.autoStart | false | Automatically start the web server when VS Code opens. |
webAccess.allowedExtensions | ["mr-innovations.mr-multi-coder"] | Extension IDs allowed for installation in the web instance |
webAccess.sessionTimeout | 24 | Web session timeout in hours |
webAccess.maxSessions | 5 | Maximum concurrent web sessions. |
tunnel.apiBaseUrl | https://mr-coder.io | Base URL for the mr-coder.io API |
tunnel.autoConnect | true | Automatically start cloudflared when VS Code opens (if a tunnel is configured). |
rollout.killSwitch | false | Operator kill-switch — when true, the extension disables itself on activation |
rollout.killSwitchMessage | This MR Multi coder version has been disabled by the operator. Update to the latest version to restore functionality. | Message shown to the user when the kill-switch is on |
mcpServers | {} | MCP server configurations |
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
Ctrl+Shift+A | Open Chat |
Ctrl+Shift+Alt+A | New Conversation |
Ctrl+Escape | Toggle focus between editor and chat |
Ctrl+Shift+L | Add editor selection to chat |
Alt+K | Insert @path mention for selection |
Escape Escape | Stop generation |
Enter | Send message |
Shift+Enter | Newline in composer |
Up/Down | Cycle prior prompts |
Full command reference with examples in the Commands documentation.