Claude Code in VS Code vs Terminal: Features and Settings

15 min read

Claude Code in VS Code vs terminal: what only the extension or the CLI can do, which settings files both read, and why MCP servers in settings.json never load.

Renaissance-style landscape of a mountain path climbing toward a monastery in morning light, a red cloak on the trail

Of the two main ways to run Claude Code inside VS Code, only the extension’s chat panel withholds text you select in a gitignored file, such as a .env file holding API keys: by default Claude gets that file’s path at most. Only the CLI takes a shell command typed after !, such as ! npm test, runs it without Claude interpreting or approving it, and adds the output to the conversation; the chat panel has no ! shortcut. Differences like these two decide most of the Claude Code in VS Code vs terminal choice. Both are documented in Anthropic’s VS Code guide and its interactive mode reference as of September 2026.

The extension’s panel runs its own bundled copy of the CLI, so the two surfaces differ mainly in the interface, and the two copies can run different versions. I build and maintain this site with the Claude Code extension in VS Code on Windows 11, and from that setup the surface is the smaller decision and the settings file the bigger one.

Both surfaces read the same settings files, so switching surface cannot rescue a setting that sits in the wrong file. My own user settings file lists two MCP servers, and Claude Code reads neither from it: the Ahrefs tools in my sessions come from a separate entry in ~/.claude.json.

Claude Code in VS Code vs Terminal: Which Should You Use?

Use the VS Code extension to accept or reject Claude’s edits one change at a time in Manual mode, comment on plans inline and keep conversations open in tabs; run claude in the integrated terminal for the full command set, the ! shortcut, tab completion and /config. Both read ~/.claude/settings.json and share conversation history.

Checked on 30 September 2026 against the extension vs CLI section of the VS Code guide and the pages it links, for Claude Code v2.1.283 or later:

CapabilityVS Code extension (chat panel)CLI in the integrated terminal
Built-in commands and skillsA subset; type / to see yoursAll of them
Shell commands from the promptNo !; @terminal:name pulls in a terminal’s output! runs a command and adds its output
Tab completionNoYes
/config settings menuNot opened; use the extension’s settings or a settings fileYes
Reviewing an edit in Manual modeA diff with per-change Accept and Reject buttons (v2.1.275+)VS Code’s diff viewer while connected; diffTool can keep it in the terminal
PlansMode indicator or /plan (v2.1.280+); comment inline on the Markdown planShift+Tab or /plan
Rewind (checkpoints)Hover a message: fork, rewind code, or both/rewind, or Esc twice on an empty prompt
Selection in a gitignored or excluded fileWithheld by default; Claude gets the path at mostSent whatever the file; a Read deny rule blocks it
Pasting a long briefPasted text stays visible in the prompt boxA large paste collapses to a placeholder
Parallel conversationsTabs, windows and a sessions list with groups and filtersclaude in a second terminal tab, or agent view (claude agents, research preview)
Saving a “don’t ask again” approvalYou pick the file, including the shared project fileYour local settings file only
Remote Control/remote-control or /rc; no name argument or QR codeAlso claude remote-control server mode, --name and a QR code
MCP servers/mcp dialog; adds and removes servers from v2.1.261claude mcp add, or /mcp
Where it comes fromBundled in the extension; claude is not added to your PATHThe standalone install

The extension also has an in-between option: turn on Use Terminal (claudeCode.useTerminal) or run Claude Code: Open in Terminal from the Command Palette, and it opens the CLI-style interface in place of the chat panel. Anthropic’s guide does not say which of the CLI-only rows above that mode changes.

Which permission mode each surface starts in, and how to cut repeat prompts, is covered in why Claude Code keeps asking for permission. The commands from the CLI’s full set that a marketer is most likely to reach for are in my Claude Code commands cheat sheet, which links Anthropic’s complete table.

Advertisement

Two Settings Layers: VS Code’s and Claude Code’s

Anthropic’s VS Code guide splits configuration in two (configure settings):

  • “Extension settings in VS Code: control the extension’s behavior within VS Code”
  • “Claude Code settings in ~/.claude/settings.json: shared between the extension and CLI”

Anthropic’s settings docs add that the terminal, the VS Code and JetBrains extensions and the desktop app “all read the same settings files”. The diagram maps which surface reads which layer, along with the one-session launch flags that exist only when you start claude yourself.

Diagram of the settings each Claude Code surface reads in VS Code: the extension alone reads its claudeCode settings in VS Code, the terminal CLI alone takes one-session launch flags, and both read Claude Code's own files (the user, project and local settings.json files, ~/.claude.json and .mcp.json), while an mcpServers block in settings.json is read by neither

Two user-level files share the name settings.json. VS Code keeps its own user settings, the extension’s included, in %APPDATA%\Code\User\settings.json on Windows (VS Code settings docs). Claude Code’s user settings file is ~/.claude/settings.json, which on Windows means %USERPROFILE%\.claude\settings.json.

Layer 1: Claude Code VS Code Extension Settings

Open them with Ctrl+, (Cmd+, on Mac), then Extensions, then Claude Code. Each ID starts with claudeCode., and the defaults come from the extension settings table:

SettingDefaultWhat it controls
preferredLocationpanelWhere Claude opens: sidebar (right) or panel (a new tab)
useTerminalfalseOpens the CLI-style interface (terminal mode) instead of the graphical panel
autosavetrueSaves files before Claude reads or writes them
attachOpenFiletrueAdds the file open in the editor to your messages (v2.1.271 or later)
respectGitIgnoretrueLeaves .gitignore patterns out of file searches and selection context
environmentVariables[]Environment variables for the Claude process the extension starts
claudeProcessWrapperunsetThe executable that launches the Claude process, such as a separately installed claude binary
initialPermissionMode and allowDangerouslySkipPermissionsunset and falseThe starting permission mode, and whether Bypass permissions appears in the mode selector, which the docs say to use only in sandboxes with no internet access

The docs steer shared configuration out of this layer: next to environmentVariables they say “Use Claude Code settings instead for shared config.”

Layer 2: Claude Code Settings Files Both Surfaces Read

FileApplies toWhat goes in itWho writes it
~/.claude/settings.jsonYou, in every projectDefault model, effort per model, permission rules, env, hooks, Remote Control at startupYou, plus /model, /effort and the extension’s model picker
.claude/settings.jsonEveryone in the project, once committedTeam permissions, hooks, pluginsYou or your team
.claude/settings.local.jsonYou, in this projectPersonal overrides and “Yes, and don’t ask again” approvalsYou and Claude Code
~/.claude.jsonYouSign-in, MCP servers at user and local scope, trust decisions, global keys such as autoConnectIde and diffToolClaude Code itself, through /config, claude mcp add and the /mcp dialog; the docs say you don’t need to edit it
.mcp.json at the project rootEveryone in the project, once committedProject-scoped MCP serversclaude mcp add --scope project, or you

Sources: settings files and who they affect, MCP installation scopes and the global config keys, which Claude Code ignores anywhere except ~/.claude.json.

When a key appears in more than one file, Claude Code uses the value from the highest level that sets it: managed settings, then command-line flags, then .claude/settings.local.json, then .claude/settings.json, then your user settings file. Lists merge across files instead of overriding, except four model keys with their own rules: fallbackModel, modelPicker, an availableModels list set in managed settings, and modelSettings (settings precedence).

Adding "$schema": "https://json.schemastore.org/claude-code-settings.json" to the top of ~/.claude/settings.json gives you autocomplete and inline validation in VS Code. The docs warn the schema “can lag behind the newest CLI releases”, so a warning on a newly documented key is not proof of an error.

My Settings Map as of 30 September 2026

This is layer 2 on my machine, with Claude Code v2.1.283 or later. The rest of my setup, from slash commands to auto memory, is in the Claude Code setup behind this site.

FileKeyMy valueWhat it does
~/.claude/settings.jsonmodel"opus"New sessions start on the latest Opus, which the model aliases table maps to Opus 5.5 on the Anthropic API
~/.claude/settings.jsonmodelSettingsxhigh for claude-opus-5, medium for claude-opus-5-5One saved effort level per model
~/.claude/settings.jsonremoteControlAtStartuptrueEvery new interactive session connects to Remote Control on its own
~/.claude/settings.jsonagentPushNotifEnabledtrueLets Claude send a push notification to a phone signed in to the Claude app; the settings reference says pushes arrive while Remote Control is connected
~/.claude/settings.jsonmcpServersFigma and Ahrefs entriesNothing: settings.json does not read this key
~/.claude.jsontop-level mcpServersAhrefs, "type": "http"A user-scope server, and the source of the Ahrefs tools in my sessions
~/.claude.json, this repo’s entrymcpServersNoneNo local-scope servers for this project
.mcp.jsonNoneNo fileNo project-scope servers
~/.claude/settings.json, .claude/settings.json and .claude/settings.local.jsonpermissionsAllow rules in all three filesPre-approved commands, fetch domains and MCP tools, counted per file in the permissions guide linked above
Any settings filehooksNoneI do not use Claude Code hooks

My sessions run with Git Bash and PowerShell as shells; Windows install routes and shells are compared in Claude Code on WSL vs native Windows.

Where Claude Code Reads MCP Servers From

Anthropic’s MCP docs list three scopes for a server you add yourself (scope hierarchy and precedence):

ScopeStored inLoads in
Local, the default for claude mcp add~/.claude.json, under the project’s pathThat project only
Project.mcp.json at the project rootThat project, for everyone who has the file, after a one-time approval
User~/.claude.json, at the top levelEvery project on your machine

When one server name appears in more than one scope, local beats project and project beats user. Plugin-provided servers and claude.ai connectors rank below all three.

~/.claude/settings.json is missing from that table. The troubleshooting table on Anthropic’s debug your configuration page lists the symptom “MCP servers added under mcpServers in settings.json never appear” with the cause “settings.json does not read an mcpServers key”. The VS Code guide’s settings section points the other way, naming “allowed commands, environment variables, hooks, and MCP servers” as what that file is for. The MCP keys your user, project or local settings file does accept approve or restrict servers, such as enableAllProjectMcpServers, allowedMcpServers and deniedMcpServers.

My user settings file has exactly this problem: its mcpServers block holds Figma and Ahrefs entries, both written as launch commands, and no Figma tools load in my sessions.

To move a server out of the settings file:

  1. See what loaded: /mcp in the chat panel, or claude mcp list in the terminal, which shows each server’s health status.
  2. With the standalone CLI installed, re-add each entry with claude mcp add-json <name> '<json>' --scope user, passing the object inside mcpServers rather than the wrapper (add servers from JSON). An entry with a url and no type needs a type such as "http" added first, since Claude Code reads an entry with no type as a stdio server. The same page’s tip reads “Make sure the JSON is properly escaped in your shell”; its examples wrap the JSON in single quotes, which Git Bash passes through as written. On Windows, VS Code’s integrated terminal opens PowerShell by default (terminal profiles); if the command rejects the JSON there, switch the profile to Git Bash with Terminal: Select Default Profile, or add the server from the /mcp dialog in step 3.
  3. Or add it from the chat panel’s /mcp dialog, which from v2.1.261 saves to the same configuration as claude mcp add (MCP in the VS Code guide). A guide that says servers can be added only from the terminal is out of date for v2.1.261 and later.
  4. Delete the old block from settings.json, so the file stops listing servers that never load.
  5. Start a new conversation and check that the server shows Connected in /mcp. The VS Code guide says changes from the dialog or the terminal “take effect in conversations you start afterwards.”

How to Change the Model in the Claude Code VS Code Extension

In the chat panel, click the model name at the bottom of the prompt box, or open the / command menu and choose Switch model. When the model supports effort levels, the picker also shows an Effort row. Per the guide’s prompt box section, “When you pick a level other than max, Claude Code saves it for the current model as your default, under modelSettings in your user settings; max applies to the current session only.” The model name button and the Effort row need v2.1.257 or later.

In the terminal, the same choices look like this, per the model configuration docs:

What you wantCommandSaved for new sessions?
Switch model and make it your default/model opus, or Enter in the /model pickerYes, as model in ~/.claude/settings.json
Switch model for this session onlys on a row of the /model pickerNo
Set effort/effort high, or the slider in /modelYes, per model in modelSettings, except max
One launch onlyclaude --model sonnet --effort lowNo

Here are the lines of my ~/.claude/settings.json that set the model, effort and Remote Control for both surfaces, with the other keys left out:

{
  "model": "opus",
  "modelSettings": {
    "claude-opus-5": { "effortLevel": "xhigh" },
    "claude-opus-5-5": { "effortLevel": "medium" }
  },
  "remoteControlAtStartup": true
}

What those lines do, according to the effort level docs and the modelSettings entry:

  • The panel and the terminal both start new sessions on the model opus resolves to, shown in the map above.
  • Claude Code resolves modelSettings one model at a time. A new session on Opus 5.5 starts at medium, the same level Opus 5.5 uses when nothing is saved for it, and the xhigh entry applies only in a session running Opus 5.
  • Saving per model keeps an old level from following you to a new model, which matches the docs’ advice: “When you move from Opus 5 to Opus 5.5, start at medium rather than carrying over the level you used on Opus 5.” In Anthropic’s testing, “Opus 5.5 at medium matches or exceeds Opus 5 at high on coding and knowledge-work evaluations.”
  • A top-level effortLevel in your user settings file is the older format, and the docs say it “doesn’t count for Opus 5.5”.
  • A conversation you reopen with claude --resume keeps the model it was using, per the sessions docs, so it does not pick up a default you changed since.

Which model to run for which job, and what each costs per job, is in Claude Sonnet vs Opus vs Haiku.

How to Run Claude Code in VS Code’s Integrated Terminal

The chat panel needs only the extension: install Claude Code from the Extensions view (Ctrl+Shift+X, or Cmd+Shift+X on Mac), open a file and click the Spark icon in the editor toolbar, per the install section of Anthropic’s VS Code guide. The terminal route takes more steps:

  1. Install the standalone CLI from Anthropic’s setup page. The extension bundles a private copy of the CLI for its chat panel, and installing it “does not put claude on your shell PATH.”
  2. Open the integrated terminal with Ctrl+` (Cmd+` on Mac) and run claude. Per the guide’s run CLI in VS Code section, the CLI “automatically integrates with your IDE for features like diff viewing and diagnostic sharing.” It connects through a local MCP server named ide that the extension runs and /mcp hides.
  3. Run /terminal-setup once so that Shift+Enter adds a new line instead of sending. The terminal configuration docs say that in VS Code it also turns off the integrated terminal’s GPU acceleration to prevent garbled text.
  4. From a terminal outside VS Code, run /ide to connect to the editor, or turn on Auto-connect to IDE (external terminal) in /config, which saves autoConnectIde to ~/.claude.json.
  5. Proposed edits open in VS Code’s diff viewer while the CLI is connected, because diffTool defaults to "auto". To keep them in the terminal, set Diff tool to terminal in /config; that row appears only while the CLI is connected to VS Code.
  6. To carry on a panel conversation, run claude --resume and pick it from the list. The same guide says “The extension and CLI share the same conversation history.”
  7. Check both version numbers, because they come from separate copies: claude --version in the terminal, and /status in the panel for the build a conversation runs.

On 30 September 2026, claude --version on my machine printed 2.1.283, while the newest extension build installed was 2.1.285. A feature with a version floor can reach one surface first: Sonnet 5.5 needs Claude Code v2.1.284 or later, so a 2.1.283 CLI cannot run it.

Running claude inside a VS Code terminal also reinstalls the extension if you removed it. To stop that, turn off Auto-install IDE extension in /config (the autoInstallIdeExtension key).

Claude Code in VS Code vs Terminal: Choose the Surface, Then the File

The surface is the choice you can change mid-task, since claude --resume carries a panel conversation into the terminal. The file decides whether a setting applies at all, as the mcpServers block in my user settings file shows.

Open ~/.claude/settings.json and search it for mcpServers: every server listed there has to move to ~/.claude.json or .mcp.json, using the steps above, before it loads.

Frequently Asked Questions

Is Claude Code better in VS Code or in the terminal?

Neither wins outright. As of September 2026 the VS Code extension's chat panel offers per-change Accept and Reject buttons in Manual-mode diffs, inline comments on plans and conversation tabs, while only the CLI has the full command set, the ! shell shortcut, tab completion and the /config menu. Both read the same settings files and share conversation history.

How do I change the model in the Claude Code VS Code extension?

Click the model name at the bottom of the prompt box, or pick Switch model from the / command menu. If the model supports effort levels, the picker also shows an Effort row, and any level except max is saved for that model under modelSettings in ~/.claude/settings.json.

Where are the Claude Code VS Code extension settings stored?

The extension's own settings, such as preferredLocation and useTerminal, are VS Code settings under Extensions, then Claude Code. Settings shared with the CLI, such as the default model and permission rules, live in ~/.claude/settings.json and the project's .claude folder, and MCP servers live in ~/.claude.json or .mcp.json.

How do I use Claude Code in VS Code?

Install the Claude Code extension, open a file and click the Spark icon in the editor toolbar to open the chat panel. For the CLI-style interface, turn on Use Terminal in the extension's settings, or install the standalone CLI and run claude in the integrated terminal, since the extension does not add claude to your PATH.

Why do MCP servers in my Claude Code settings.json not load?

Anthropic's troubleshooting docs say settings.json does not read an mcpServers key. Add the server with claude mcp add or the /mcp dialog, which save local- and user-scope servers to ~/.claude.json (use --scope user to load it in every project), or put team servers in .mcp.json at the project root.

Advertisement
Swapnil Biswas

Written by Swapnil Biswas

Product Marketing & Growth Strategist. I write about AI, SEO, and marketing strategy from real experience - not theory.