Every extension setting uses the intellij-sfcc.* prefix. Open Settings (Cmd+, / Ctrl+,) and search for Intellij SFCC, or edit settings.json directly with Preferences: Open User Settings (JSON) or Preferences: Open Workspace Settings (JSON). You only need to add the settings you want to change; anything you leave out keeps the default shown on this page
Connection selection, code version, and Auto Upload are not settings. They belong to the active connection and are managed from the Connections panel and its status-bar actions
User or workspace settings
VS Code keeps two levels of settings, and the workspace level wins when both define the same key:
- User settings apply to every project you open. Use them for personal preferences such as tag colors, the formatter, or Log Center performance tuning
- Workspace settings live in
.vscode/settings.jsonand apply to one project. Use them for values the whole team should share, such as custom completion rules,<ismodule/>file names, or a fixed MCP port
Never put hostnames, usernames, passwords, or access keys in settings.json. Credentials live in the encrypted credentials file, and connections are stored separately, so .vscode/settings.json stays safe to commit
Some settings are also written for you by the extension:
| Setting | Written by | Level |
|---|---|---|
intellij-sfcc.credentialsFilePath | The Credentials panel when you create or select a credentials file | User |
intellij-sfcc.deployment.clearCodeVersion | An AI agent through the confirmed MCP deploy settings tool | Workspace |
intellij-sfcc.mcp.tools.profile, mcp.tools.enabled, mcp.tools.disabled | The profile picker and tool toggles in the MCP panel | Workspace |
intellij-sfcc.logs.* | The Log Center Settings tab | User, or the level that already overrides the value |
When changes take effect
Most settings apply as soon as you save. The exceptions are listed below
| Change | What happens |
|---|---|
intellij-sfcc.isml.modules.files | The ISML server keeps the new list but reads the module files again only on the next module-file change. Run Developer: Reload Window to apply it at once |
intellij-sfcc.mcp.enabled, mcp.auth.enabled, mcp.allowDeprecatedSse, mcp.port | The local MCP server restarts with the new values. Connected AI clients need to reconnect |
intellij-sfcc.mcp.tools.*, mcp.analytics.* | Applied to the running MCP server without a restart. Clients that do not react to tools/list_changed need their refresh or reconnect action |
| Everything else | Applied immediately |
Workspace and deployment
| Setting | Default | Purpose |
|---|---|---|
intellij-sfcc.credentialsFilePath | "" | Absolute path to the encrypted credentials file shared across projects |
intellij-sfcc.concurrentRequestsPerSecond | 7 | Maximum parallel WebDAV requests for auto upload and deployments |
intellij-sfcc.deployment.clearCodeVersion | false | How deployment cleans the target code version before uploading |
intellij-sfcc.metadataAttributes.colorMode | "unusedOnly" | How metadata attribute definitions in XML are colored by usage: "off", "unusedOnly", or "heatmap" |
SFCC MCP
These settings control the local MCP server that lets AI clients such as Claude Code, Cursor, Codex, and GitHub Copilot use your project's SFCC knowledge. See SFCC MCP for connecting a client
| Setting | Default | Purpose |
|---|---|---|
intellij-sfcc.mcp.enabled | true | Start the local MCP server together with the scripting language server |
intellij-sfcc.mcp.port | 0 | Loopback port. 0 picks a stable automatic port per workspace |
intellij-sfcc.mcp.auth.enabled | false | Require a workspace bearer token from MCP clients |
intellij-sfcc.mcp.allowDeprecatedSse | false | Also serve the legacy /sse and /messages endpoints |
intellij-sfcc.mcp.tools.profile | "sfcc-full" | Which group of tools AI clients can see |
intellij-sfcc.mcp.tools.enabled | [] | Tools to show even when the profile hides them |
intellij-sfcc.mcp.tools.disabled | [] | Tools to hide even when the profile shows them |
intellij-sfcc.mcp.tools.allowAgentProfileActivation | false | Deprecated and ignored |
intellij-sfcc.mcp.analytics.captureRaw | false | Also store full, unredacted request and response payloads in local analytics |
Server and port
The server listens on the loopback interface only, so it is never reachable from other machines. With mcp.port set to 0, the extension derives a port from the workspace path (in the 32768-57767 range) and remembers it, so the address in your client configuration stays the same between VS Code sessions
Set an explicit port when a client configuration must point to a known address, or when the automatic port collides with another service. Put it in workspace settings; a port in user settings applies to every window, and two open projects would then compete for the same port:
{
"intellij-sfcc.mcp.port": 43210
}Set mcp.enabled to false to stop the server completely, for example on a project where you do not use AI clients
Authentication
By default, any local process can call the server. With mcp.auth.enabled set to true, clients must send a bearer token that is unique to the workspace. The token is generated on first use, stored in VS Code SecretStorage, and handed to clients through the INTELLIJ_SFCC_MCP_TOKEN environment variable. Generated client configuration snippets reference that variable and never contain the token itself
{
"intellij-sfcc.mcp.auth.enabled": true
}Enable it on shared machines or when other local tools should not reach your SFCC instance through MCP. Copy or rotate the token from the MCP panel
Tool profiles
Profiles are cumulative: each one contains everything in the profile before it
| Profile | Adds | Can change anything? |
|---|---|---|
router-core | Project context, client profile, tool policy status, and tool recommendations only | No |
sfcc-readonly | Local code intelligence: cartridge path and overrides, */ and ~/ resolution, DW types, routes, hooks, templates, resources, forms, pipelines, and references | No, local reads only |
sfcc-operational | Reads from the connected instance: logs, WebDAV list and read, instance, site, and code-version status, remote diff, debugger context | No, remote reads only |
sfcc-plan | Plan tools that describe a deploy, upload, WebDAV change, or code-version change without running it | No, plans only |
sfcc-full | Execute tools for the planned operations | Yes. Uploads and deploys of code run at once, and every other guarded action needs a confirmation in VS Code |
Pick the smallest profile that covers the task. sfcc-readonly suits day-to-day coding, sfcc-operational adds sandbox debugging, and sfcc-full is for short, supervised sessions where the agent needs to deploy or upload. Choosing a profile in the MCP panel writes this setting to workspace settings for you
Enabling or disabling individual tools
mcp.tools.enabled and mcp.tools.disabled adjust the chosen profile tool by tool, using full intellijsfcc.* tool names. Each tool is resolved in this order:
- Core tools (
intellijsfcc.project.context,intellijsfcc.client.profile,intellijsfcc.skills.list,intellijsfcc.skills.read,intellijsfcc.task.plan,intellijsfcc.tools.policy.status,intellijsfcc.tools.recommend) are always available and cannot be disabled - A tool listed in
mcp.tools.disabledis hidden - A tool listed in
mcp.tools.enabledis shown - Otherwise the profile decides
Because disabled wins over enabled, listing a tool in both hides it. For example, keep an agent read-only on your code but let it search Log Center:
{
"intellij-sfcc.mcp.tools.profile": "sfcc-readonly",
"intellij-sfcc.mcp.tools.enabled": ["intellijsfcc.logs.center.search"]
}Or allow everything except deployment:
{
"intellij-sfcc.mcp.tools.profile": "sfcc-full",
"intellij-sfcc.mcp.tools.disabled": ["intellijsfcc.deploy.execute"]
}Switching individual tools on or off in the MCP panel updates these two lists in workspace settings
Legacy transport and analytics
Streamable HTTP is the normal transport. Enable mcp.allowDeprecatedSse only for an older client that can connect exclusively through the SSE endpoints
Request metadata such as tool names, timings, and status is always logged locally under .intellij-sfcc/mcp-analytics in the workspace. mcp.analytics.captureRaw additionally stores the complete request and response bodies, which helps when debugging a misbehaving client
Raw capture is unredacted. Payloads can contain credentials, tokens, cookies, prompts, and source code. Turn it on only while debugging, turn it off afterwards, and keep .intellij-sfcc/ out of version control (the .gitignore the extension writes there does that unless you replaced it)
mcp.tools.allowAgentProfileActivation no longer has any effect. Agents cannot change the profile; select it in the MCP panel, then refresh or reconnect the client
Log Center
These settings tune how Log Center downloads, parses, indexes, and displays instance logs. The Settings tab in Log Center edits the same values, and changes apply without a reload. Values outside the allowed range are clamped to the nearest limit
| Setting | Default | Range | Purpose |
|---|---|---|---|
intellij-sfcc.logs.parseConcurrency | 10 | 1-32 | Parse and tail worker jobs that can run at the same time |
intellij-sfcc.logs.initialParseConcurrency | 3 | 1-8 | CPU-heavy parses allowed at once during a bulk initial import |
intellij-sfcc.logs.rangeChunkSizeMb | 4 | 1-64 | Megabytes per tail read, fallback range download, or local parse chunk |
intellij-sfcc.logs.tailIntervalMs | 1000 | 250-60000 | How often watched log files are polled for new lines, in milliseconds |
intellij-sfcc.logs.autoRefreshIntervalSec | 5 | 2-600 | How often the list of remote log files is refreshed, in seconds |
intellij-sfcc.logs.maxIndexedOccurrences | 50000 | 1000-1000000 | Recent occurrences kept for in-memory search when SQLite full-text search is unavailable |
intellij-sfcc.logs.maxRawExamples | 5000 | 100-100000 | Recent raw log lines kept in memory for event details and reports |
intellij-sfcc.logs.filterOptionBatchSize | 100 | 25-500 | Values rendered first, and added per scroll step, in large filter menus |
intellij-sfcc.logs.maxFacetValues | 10000 | 100-50000 | Distinct source, site, endpoint, and session values sent to filter menus |
How the values work together
- Throughput versus CPU.
parseConcurrencylimits all worker jobs, including tails that mostly wait on the network.initialParseConcurrencylimits only the CPU-bound work of parsing freshly downloaded files. Raise the second one on a machine with many cores to import a day of logs faster; lower it when VS Code feels sluggish during an import - Chunk size. Initial parses of remote files normally download a ZIP first.
rangeChunkSizeMbsets the size of each ranged read used for tailing, for the fallback when a ZIP download is not possible, and for streaming local files. Larger chunks mean fewer requests but more memory per job - Freshness versus load.
tailIntervalMssets how quickly new lines appear in a watched file, andautoRefreshIntervalSecsets how quickly newly created log files appear in the list. Shorter intervals send more requests to the instance - Memory.
maxRawExamplesandmaxIndexedOccurrencesbound the memory used by detail views, reports, and fallback search. Older entries are dropped first; parsed results already stored on disk are not affected - Filter menus.
maxFacetValuescaps how many distinct values a filter menu can list. Typing an exact value still filters correctly beyond the cap.filterOptionBatchSizeonly affects how quickly a long menu opens
{
"intellij-sfcc.logs.initialParseConcurrency": 6,
"intellij-sfcc.logs.rangeChunkSizeMb": 16,
"intellij-sfcc.logs.maxRawExamples": 20000,
"intellij-sfcc.logs.maxFacetValues": 30000
}Imports large log sets faster, keeps more raw lines for reports, and lists more distinct sessions and endpoints in filters, at the cost of more CPU and memory
Getting started, releases, and pipelines
| Setting | Default | Purpose |
|---|---|---|
intellij-sfcc.gettingStarted.doNotOpenAutomatically | false | Stop the Getting Started page from opening by itself |
intellij-sfcc.gettingStarted.statusBarIconOnly | false | Show only the red panda in the Setup status bar item, without its text |
intellij-sfcc.releases.notifications | true | Notify you about release notes for your installed version and about newer releases |
intellij-sfcc.pipelines.nodeGutterIcons | true | Show the pipeline node type icon in the gutter of each node line when a pipeline XML file is open as source |
Without gettingStarted.doNotOpenAutomatically, the Getting Started page opens every time a window starts on an SFCC project whose setup is unfinished. The page has the same switch as a Don't open automatically checkbox, and the Setup item in the status bar always opens it. With gettingStarted.statusBarIconOnly the item keeps its tooltip with the setup progress
releases.notifications checks at startup and every five minutes while the window is focused. Release history stays available in the Account view when it is off. Both settings are application wide, so they apply to every window
pipelines.nodeGutterIcons uses the same icons as the Pipeline Editor (start, pipelet, script, decision, join, interaction, and more), so you can read a pipeline's XML source at a glance
ISML editing
| Setting | Default | Purpose |
|---|---|---|
intellij-sfcc.isml.formatter.enabled | true | Format .isml files with the built-in formatter |
intellij-sfcc.isml.formatter.type | "Indentation" | Formatting engine: "Indentation" or "JS-Beautify" |
intellij-sfcc.isml.formatter.escapeHash | true | Format Document and Organize Imports write each bare # as ${'#'} |
intellij-sfcc.isml.formatter.wrapAttributes | "preserve" | Attribute wrapping for the JS-Beautify engine |
intellij-sfcc.isml.linter | true | ISML template checks: unclosed and misplaced tags, missing required attributes and a bare # |
intellij-sfcc.isml.modules.files | ["modules.isml", "module.isml"] | File names scanned for <ismodule/> custom tag declarations |
intellij-sfcc.customTagColorDark | "#2ed09a" | Color of <is…> tags in dark themes |
intellij-sfcc.customTagColorLight | "#0a7b7b" | Color of <is…> tags in light themes |
Formatter
The ISML language server formats .isml files, so Format Document, Format Selection, and format on save use it. If another extension also formats ISML, choose the formatter with Format Document With.... The two engines behave differently:
Indentationre-indents ISML and HTML structure (block tags,<iselse>/<iselseif>branches, nested markup) and leaves everything else exactly as written: tag text, attributes,${...}expressions, and one-line markup. A bare#is the one exception, escaped whileformatter.escapeHashis on. It followseditor.tabSizeandeditor.insertSpaces.wrapAttributeshas no effect on this engineJS-Beautifyis the legacy engine. It rewrites markup with js-beautify and reads VS Code'shtml.format.*settings (such ashtml.format.wrapLineLengthandhtml.format.indentInnerHtml) in addition towrapAttributes
wrapAttributes accepts the js-beautify values preserve, auto, force, force-aligned, force-expand-multiline, aligned-multiple, and preserve-aligned. With preserve, line wrapping is turned off completely so existing attribute layout is kept. For example, to put each attribute on its own line when a tag is too long:
{
"intellij-sfcc.isml.formatter.type": "JS-Beautify",
"intellij-sfcc.isml.formatter.wrapAttributes": "force-expand-multiline",
"html.format.wrapLineLength": 120
}Set formatter.enabled to false when your team formats ISML with another tool, such as Prettier. See Formatting for before-and-after examples
Linter and custom tags
isml.linter turns the ISML server's template checks on or off: unclosed and misplaced ISML tags, missing required attributes, and the bare # error with its quick fixes. A change applies without a restart. Problems inside ${...} and <isscript> come from the Script server either way. See ISML diagnostics
isml.modules.files lists the file names the ISML server scans for <ismodule/> declarations. Tags declared in matching files complete with their attributes in every template, and the tag name links to the module template. Add your own file names if your project declares custom tags elsewhere, and keep the defaults you still use, because the list replaces the default:
{
"intellij-sfcc.isml.modules.files": ["modules.isml", "module.isml", "brandmodules.isml"]
}See Custom tags for how module declarations are resolved
Tag colors
customTagColorDark and customTagColorLight color every tag that starts with <is, so ISML logic stands out from HTML. Dark themes use customTagColorDark; light themes and both high contrast themes use customTagColorLight. The extension applies the color through editor.semanticTokenColorCustomizations for the active theme in your user settings, and changing the theme or either color updates the editor immediately
{
"intellij-sfcc.customTagColorDark": "#c792ea",
"intellij-sfcc.customTagColorLight": "#7c4dff"
}Scripting completion rules
The scripting language server offers route, hook, template, and resource completions inside string arguments of specific functions. These rules tell it which functions and which argument to watch, so you can extend completions to your project's own helpers
| Setting | Completes | Default rules |
|---|---|---|
intellij-sfcc.completions.routes | Controller route names such as Cart-Show | URLUtils.url/abs/http/https, any url/abs/http/https call, and URLAction, argument 0 |
intellij-sfcc.completions.hooks.name | Hook extension point names | callHook, hasHook, hooksHelper, hookHelper, argument 0 |
intellij-sfcc.completions.hooks.function | Function names implemented for a hook | callHook, hooksHelper, hookHelper, argument 1 |
intellij-sfcc.completions.templates | ISML template paths | render/renderTemplate argument 0, and sendEmail argument 1 |
intellij-sfcc.completions.resources.properties | Resource property keys | msg/msgf, argument 0 |
intellij-sfcc.completions.resources.bundles | Resource bundle names | msg/msgf, argument 1 |
Rule format
Each setting is an array of rules. A rule has three fields:
| Field | Required | Meaning |
|---|---|---|
methods | Yes | Function or method names that trigger the completion |
paramIndex | Yes | Zero-based position of the argument that receives the completion. 0 is the first argument |
className | No | Restrict the rule to calls on this exact identifier, such as URLUtils.url(...) |
Without className, a rule matches both a plain call (myHelper('...')) and a method call on any object (helpers.myHelper('...')). With className, it matches only ClassName.method('...') where the receiver is written as that identifier. Completion triggers inside a string literal, including a string that is part of a + concatenation
routes adds to its defaults: your rules are tried first, then the built-in ones, which always stay on. Every other array replaces its defaults instead of adding to them, so copy the default rules you still need into your value, as in the examples below
Examples
A project wraps URLUtils in its own helper, urlHelper.getUrl(action, params). To get route completion in that helper, add one rule. The built-in route rules stay on after it:
{
"intellij-sfcc.completions.routes": [
{ "methods": ["getUrl"], "paramIndex": 0 }
]
}The same route rules drive go to definition, references and the usage counts of the route CodeLens. A list that still repeats the built-in rules works too, each rule is used once. The JetBrains plugin reads this setting from the project's .vscode/settings.json as well, see SFCC Route Calls
A custom email service takes the template as its second argument, emailService.send(recipient, templatePath, context):
{
"intellij-sfcc.completions.templates": [
{ "methods": ["render", "renderTemplate"], "paramIndex": 0 },
{ "methods": ["sendEmail"], "paramIndex": 1 },
{ "className": "emailService", "methods": ["send"], "paramIndex": 1 }
]
}A localization wrapper, i18n.t(key, bundle), mirrors Resource.msg. Add it to both resource rules so keys and bundles complete:
{
"intellij-sfcc.completions.resources.properties": [
{ "methods": ["msg", "msgf"], "paramIndex": 0 },
{ "methods": ["t"], "paramIndex": 0 }
],
"intellij-sfcc.completions.resources.bundles": [
{ "methods": ["msg", "msgf"], "paramIndex": 1 },
{ "methods": ["t"], "paramIndex": 1 }
]
}Rule changes are sent to the language server as soon as you save. See Code completion for everything else the scripting server completes
Unused setting
intellij-sfcc.editor.scripts.hooks-identifiers appears in the Settings UI but is not read by the extension. Its declaration duplicates the resource-bundle rule and has a mismatched type, so leave it unset
Defaults the extension sets
Installing the extension also changes a few VS Code defaults. They behave like any default: a value in your user or workspace settings wins. The one exception is the ISML default formatter, which the extension writes into your user settings on every start
| VS Code setting | Default from Intellij SFCC |
|---|---|
files.associations | **/cartridge/**/*.js and *.ts open as SFCC JavaScript and SFCC TypeScript, except files under cartridge/client and cartridge/static, which stay plain JavaScript and TypeScript. Pipeline XML under pipelines/ opens as SFCC pipeline XML |
workbench.editorAssociations | Pipeline XML files under pipelines/ open in the Pipeline Editor |
editor.quickSuggestions | Suggestions inside strings and comments for SFCC JavaScript, SFCC TypeScript, and DigitalScript, and inside strings for ISML, so route, template, and resource completions appear while you type |
"[isml]" in user settings | Set to "editor.defaultFormatter": "intellijsfcccom.intellij-sfcc" on every start. This replaces the whole user "[isml]" block, so keep other ISML-only settings, such as editor.formatOnSave, under "[isml]" in workspace settings. See Formatting |
To open pipelines as text by default, map the pattern back to the text editor in your settings:
{
"workbench.editorAssociations": {
"**/cartridge/pipelines/*.xml": "default",
"**/pipelines/*.xml": "default"
}
}Theme colors
The extension contributes theme colors that you can override with workbench.colorCustomizations:
| Color | Used for |
|---|---|
intellijsfcc.metadataAttribute.unusedForeground, unusedOverviewRuler | Metadata attributes with no usages, and their scrollbar marker |
intellijsfcc.metadataAttribute.lowUsageForeground, mediumUsageForeground, highUsageForeground | Metadata attributes with 1-2, 3-9, and 10 or more usages in "heatmap" mode |
intellijsfcc.debugger.statusBar.readyBackground, readyForeground | The debugger status bar item when it is ready to start |
intellijsfcc.debugger.statusBar.runningBackground, runningForeground | The debugger status bar item while a session runs |
intellijsfcc.gettingStarted.statusBar.setupForeground | The orange accent in the Getting Started walkthrough |
{
"workbench.colorCustomizations": {
"intellijsfcc.metadataAttribute.unusedForeground": "#e06c75",
"intellijsfcc.metadataAttribute.highUsageForeground": "#7aa2f7"
}
}Complete example
A shared .vscode/settings.json for a team project, with no connection or credential values:
{
// Keep deployments gentle on a small sandbox
"intellij-sfcc.concurrentRequestsPerSecond": 3,
// Find dead custom attributes in metadata XML
"intellij-sfcc.metadataAttributes.colorMode": "unusedOnly",
// AI clients can read code and the sandbox, but never change it
"intellij-sfcc.mcp.port": 43210,
"intellij-sfcc.mcp.auth.enabled": true,
"intellij-sfcc.mcp.tools.profile": "sfcc-operational",
// Project-specific ISML custom tag declarations
"intellij-sfcc.isml.modules.files": ["modules.isml", "module.isml", "brandmodules.isml"],
// Route completion inside the project's URL helper, before the built-in rules
"intellij-sfcc.completions.routes": [
{ "methods": ["getUrl"], "paramIndex": 0 }
]
}VS Code accepts comments in settings.json. See Set Up Your Project for connections and cartridges, and SFCC MCP for connecting AI clients