SFMC Scout
Universal Chrome Extension for Salesforce Marketing Cloud — search, inspect, manage, and export your entire SFMC instance from a persistent side panel. No login required.
SFMC Scout injects a persistent side panel into any SFMC page. It uses your active browser session (cookies, no CSRF tokens) to reach SFMC's internal cookie-only proxy at mc.{stack}.exacttarget.com/cloud/fuelapi/... — giving you instant access to Automations, Data Extensions, Journeys, Assets, Activities, Snippets, and cross-entity full-text search without navigating away.
Cookie-only architecture. Ghost tabs eliminated — Scout no longer spawns minimized popup windows to capture per-section CSRF tokens. All read APIs now route through SFMC's internal cookie-authenticated proxy.
Server-side search filters. Universal Search now uses real server filters ($where=name like X, nameOrDescription, $filter) instead of client-side filtering. Returns full matches even on production orgs with 5,000+ automations / 400+ journeys.
DE folder-path correctness. Search now walks the Shared Items folder tree with includeFullPath=true, so cross-BU and shared-subfolder DEs show their real path (no more [Unknown Folder]).
UI polish. Light mode is now the default. Theme toggle is single-click responsive. Toasts are theme-aware with a 2-second default, icon chip status (no green left border).
Features
Universal Search
Search across DEs, Automations, Journeys, Emails, Assets, and Activities simultaneously — streaming results in real-time.
Automation Inspector
Browse automations with status badges. Click any automation to view its full step breakdown with syntax-highlighted SQL and SSJS.
Data Extension Tools
Search, create, export (JSON/ZIP), import, and generate reports for all Data Extensions in your instance.
Journeys
Browse all active and draft journeys with color-coded status badges, version numbers, and channel display.
HTML Reports
Generate standalone HTML reports with live filter, sortable columns, dark/light theme, and export to CSV.
Snippets
Save, tag, and deploy reusable AMPscript, SSJS, and SQL snippets directly into SFMC Ace editors.
Dark / Light Mode
Toggleable theme persisted across sessions. Dark mode by default; applies to the panel and all generated reports.
No Login Required
Tokens captured passively from the active SFMC session. No credentials entered or stored externally.
Installation
SFMC Scout is a developer tool for internal use. It is not published on the Chrome Web Store and must be loaded via Developer mode.
- Download or clone the repository
- Open Chrome and navigate to
chrome://extensions/ - Enable Developer mode (toggle in the top-right corner)
- Click Load unpacked
- Select the
SFMC_Scout/folder (the one containingmanifest.json) - Verify the extension appears with the Scout icon
- Navigate to any SFMC page — the Scout toggle button will appear on the right edge of the screen
First Use
- Click the Scout tab on the right edge to open the panel
- On first open, Scout automatically captures tokens from your active session
- If tokens are missing, Scout opens minimized background tabs to trigger token capture
- Once all token badges show green, all features are available
Scout auto-detects your SFMC stack from the active tab URL (e.g. mc.s51.exacttarget.com → stack s51). Stacks s1 through s51 are supported plus custom configurations.
Architecture
SFMC Scout uses a modular, layered architecture. The content script handles all UI rendering and event handling; the background service worker handles token interception, CORS proxy, and message routing; specialized handlers in handlers/ implement per-entity business logic.
File Structure
SFMC_Scout/
├── manifest.json MV3 config (permissions, scripts, icons)
├── content.js Panel UI, state (S), event handling (~2,800 lines)
├── background.js Service worker: webRequest, CORS proxy, message hub
├── panel.css All panel + component styles
├── injected_script.js Page-injected: SnippetManager + AceEditorHelper
│
├── handlers/
│ ├── search/ Per-entity search services (Auto, Journey, DE, Asset, Activity)
│ ├── automation/ Automation detail, activity code, type registry
│ ├── de/ DE folder service, field definitions, usage detection
│ ├── actions/ Quick action routes (create, export, import, report)
│ └── auth/ Token refresh coordination
│
├── services/
│ ├── DECreationService.js Create DEs via REST
│ ├── DEExportService.js Paginated export with folder resolution
│ ├── DEImportService.js Restore from JSON with folder re-creation
│ └── DEReportService.js HTML / CSV report generation
│
├── utils/
│ ├── InstanceService.js Stack detection from hostname
│ ├── APIService.js Authenticated fetch wrapper (CORS proxy)
│ ├── TokenService.js Token classification and key mapping
│ ├── CSRFService.js Token retrieval from chrome.storage
│ └── StorageService.js chrome.storage.local helpers
│
└── core/
├── SnippetManager.js Snippet storage + Ace deploy
└── AceEditorHelper.js Ace editor detection and injection
Authentication Model
Scout uses your active SFMC browser session via cookies — no credentials are entered, no per-section CSRF tokens are required for read APIs, and no external auth servers are involved. The cookie-only proxy at mc.{stack}.exacttarget.com/cloud/fuelapi/... accepts the same session cookies your browser already holds, returning full data for every entity type Scout reads.
The previous architecture spawned minimized popup windows ("ghost tabs") to force SFMC's per-module apps to issue CSRF-bearing requests, which Scout's webRequest listener then intercepted. v2.1 removes this entirely. All read APIs go through the cookie-only proxy. The two tokens still captured are used only for write operations and admin actions.
Captured Tokens (write/admin only)
| Token | Storage Key | Used For | Capture Source |
|---|---|---|---|
pageToken |
scout_pageToken |
Content Builder writes (create asset, update template) | x-csrf-token from content-builder.{stack}.marketingcloudapps.com requests |
adminToken |
scout_adminToken |
CloudPages publishing, admin operations | x-csrf-token from admin / cloudpages requests |
Both tokens are captured passively via chrome.webRequest.onBeforeSendHeaders — no fetches are issued by Scout to obtain them, and no ghost tabs are spawned.
Cookie-only request flow
Scout reads only data your SFMC user already has access to — it cannot escalate privileges. Tokens (when captured) live in chrome.storage.local, are never transmitted to any external server, and are invalidated when your SFMC session ends. The extension's host permissions are scoped to *.exacttarget.com and *.marketingcloudapps.com.
Data Flow
All API calls are proxied through the background service worker to bypass CORS restrictions. The content script sends messages to the background; the background makes authenticated fetch requests using the user's session credentials.
Search Streaming Pattern
Universal Search uses Chrome's long-lived port messaging to stream results progressively — each entity type posts results as they arrive rather than waiting for all sources to complete:
API Endpoints
SFMC Scout integrates with multiple SFMC REST API endpoints. All URLs are relative to the detected stack instance (e.g. mc.s51.exacttarget.com or {bu}.marketingcloudapps.com).
Automations
| Endpoint | Method | Purpose | Token |
|---|---|---|---|
/cloud/fuelapi/legacy/v1/beta/automations/automation/definition/ |
GET | List all automations with status, last run time | autoToken |
/cloud/fuelapi/legacy/v1/beta/automations/automation/definition/{id} |
GET | Automation detail with full step breakdown | autoToken |
Journeys
| Endpoint | Method | Purpose | Token |
|---|---|---|---|
/cloud/fuelapi/interaction/v1/interactions/ |
GET | List journeys (active + draft, with stats, trigger, tag) | journeyToken |
Data Extensions
| Endpoint | Method | Purpose | Token |
|---|---|---|---|
/cloud/fuelapi/data-internal/v1/customobjects |
GET | Search / list Data Extensions (paginated) | deToken |
/cloud/fuelapi/data-internal/v1/customobjects/{id}/fields |
GET | Field definitions for a specific DE | deToken |
/cloud/fuelapi/data-internal/v1/customobjects |
POST | Create a new Data Extension | deToken |
Assets & Emails (Content Builder)
| Endpoint | Method | Purpose | Token |
|---|---|---|---|
/contactsmeta/fuelapi/asset/v1/content/assets |
GET | Search Content Builder assets and emails | cbToken |
Activities (7 Types)
| Endpoint | Method | Activity Type | Token |
|---|---|---|---|
/AutomationStudioFuel3/fuelapi/automation/v1/queries/ |
GET | SQL Query Activities | autoToken |
/AutomationStudioFuel3/fuelapi/automation/v1/scripts/ |
GET | Script (SSJS) Activities | autoToken |
/AutomationStudioFuel3/fuelapi/automation/v1/filters/ |
GET | Filter Activities | autoToken |
/AutomationStudioFuel3/fuelapi/messaging-internal/v1/emailsenddefinition/ |
GET | Send Email Activities | autoToken |
/AutomationStudioFuel3/fuelapi/automation/v1/imports |
GET | Import Activities | autoToken |
/AutomationStudioFuel3/fuelapi/automation/v1/filetransfers |
GET | File Transfer Activities | autoToken |
/AutomationStudioFuel3/fuelapi/automation/v1/dataextracts |
GET | Data Extract Activities | autoToken |
Automation, Journey, and DE endpoints: https://mc.{stack}.exacttarget.com
Content Builder and Activity endpoints: https://{bu}.marketingcloudapps.com
Stack is auto-detected from the active tab URL via InstanceService.js.
Authentication
All API requests use the user's own authenticated SFMC browser session. Scout never asks for credentials — it reads CSRF tokens that SFMC itself embeds in your outgoing requests.
Request Pattern
// background.js — makeAPIRequest (CORS proxy)
async function makeAPIRequest(url, method, headers, body) {
const response = await fetch(url, {
method,
headers,
body,
credentials: 'include' // Uses active SFMC session cookie
});
return { ok: response.ok, status: response.status, data: await response.json() };
}
Token Header Patterns
| API Type | Header | Token |
|---|---|---|
| Content Builder (assets) | x-csrf-token: {cbToken} |
cbToken |
| Data Extensions | x-csrf-token: {deToken} |
deToken |
| Automations / Activities | x-csrf-token: {autoToken} |
autoToken |
| Journeys | x-csrf-token: {journeyToken} |
journeyToken |
Tokens expire with your SFMC session (typically 30–60 minutes). If you encounter 401 or 403 errors, refresh the SFMC page to re-capture tokens, then click Refresh Tokens in the Scout panel header.
Universal Search
Universal Search is the default view when the panel opens. A single text input searches across all SFMC entity types simultaneously, with results streaming in as each source responds.
Searchable Entity Types
| Filter | Entity Type | Fields Searched |
|---|---|---|
all |
All types simultaneously | — |
de |
Data Extensions | Name, Customer Key, folder path |
automation |
Automations | Name, status, last run time |
journey |
Journeys | Name, status, version, channel |
email |
Emails | Name, type, folder, customer key |
asset |
Content Builder Assets | Name, type, folder, ID, created by |
activity |
Activities (7 types) | Name, type, target DE, key |
Result Actions (Click to Expand)
- Automations — click result to load full step breakdown inline (SQL / SSJS / Send Email / Import / File Transfer / Data Extract / Filter)
- Assets / Emails / Templates — click to open the inline detail card. Email ID, full folder path, file size + dimensions for uploads. Action row: Preview (renders email/template thumbnail in a modal via
/artifacts/thumbnail/html?...), View image / Open file (clickablefileProperties.publishedURL), Copy name - Data Extensions — click to view field count, folder, sendable flag
- Journeys — click to open the detail card with activity count, population, entry source DE, entry criteria (code block), schedule humanizer, and "Open in JB" deep-link
- Activities — row meta line shows Type · Folder breadcrumb · Update Mode (Overwrite / Append / Update / Update Add). Folder hydrated per-row via parallel
?view=categoryinfocalls; HTTP/2 multiplexes so cost is ≈ one extra request
Search results appear progressively as each entity type responds. You don't need to wait for all sources — Automation results may appear while Journey results are still loading.
Asset Preview Modal
Clicking Preview on an email or template row opens a centered modal overlay that fetches the rendered HTML thumbnail. Two endpoint shapes are used depending on asset type:
- Email (
templatebasedemail/htmlemail/textonlyemail) →/artifacts/thumbnail/html?includeHeaderFooter=true&includeDesignContent=true - Template (
template/emailtemplate) →/artifacts/thumbnail/(no/htmlsuffix — that path 404s on pure templates)
Click outside the modal or press Escape to close. Backdrop blur, scale-in animation. Cached per asset ID — re-opens are instant.
Automations
The Automations tab lists all automation definitions in your SFMC instance with color-coded status badges. Clicking any automation loads a full step breakdown without leaving the panel.
Status Badge Colors
| Status | Color | Description |
|---|---|---|
| Active / Running | Green | Automation is currently executing |
| Scheduled | Blue | Waiting for scheduled trigger |
| Paused | Yellow | Manually paused |
| Error | Red | Last run encountered an error |
| Ready | Grey | Idle, awaiting trigger |
Step Breakdown
Clicking an automation expands the full step tree, showing every activity in every step. For SQL Query and SSJS Script activities, the code is shown with syntax highlighting in an expandable block. The detail view also includes:
- Automation key and ID
- Schedule configuration
- Last run time and next scheduled run
- Direct link to open in SFMC Automation Studio
SQL and SSJS code blocks in automation steps are fully syntax-highlighted and independently expandable/collapsible. No need to navigate to Automation Studio to read the SQL.
Data Extensions
The Data Extensions tab provides four sub-tabs: Search, Create, Export / Import, and Report.
Search
Real-time DE search with paginated results. Each result shows:
- DE name and Customer Key
- Field count
- Folder path
- Sendable flag indicator
- Testable flag indicator
Create
3-step wizard for creating a new Data Extension:
- Basic Info — Name, Customer Key, description, sendable/testable flags, folder selection
- Fields — Add typed fields with name, type (Text, Number, Date, Boolean, etc.), length, required, primary key flags
- Review & Submit — Preview the full DE definition before creating
Export
Export all Data Extensions from your instance:
- JSON Export — Structured export with field inventory, metadata, and folder path. Full paginated fetch handles thousands of DEs.
- ZIP Export — Individual JSON files per DE bundled into a downloadable ZIP archive
Import
Restore DEs from a previously exported JSON file:
- Parses and validates the JSON structure
- Optionally re-creates the original folder hierarchy
- Posts each DE to the REST API individually with progress tracking
Report
Generate a full Data Extension inventory report. See the Reports section for details on the report format.
SFMC's DE REST API limits requests per minute. Export and Report generation batch requests with delays between pages. Large instances (1,000+ DEs) may take 30–60 seconds to fully export.
Journeys
Journey rows in the universal search return rich metadata pulled directly from the interaction/v1/interactions/ bulk endpoint plus a per-row hydration via eventDefinitions/{id} when the row is expanded.
Row Pills (at-a-glance)
| Pill | Source |
|---|---|
| Status | color-coded — Published/Running (green), Draft/Paused/Unpublished (amber), Stopped/Deleted (red), Scheduled (blue) |
| vN | current version number |
| HTS | metaData.highThroughputSending.email — small blue pill when high-throughput sending is enabled |
| Channel | Email, Mobile Push, etc. |
| Definition Type | Multistep / SingleSend / Transactional / Quicksend |
| Trigger Type | EmailAudience, ApiEvent, etc. (entry-source flavor) |
Expanded Detail Card
Click any journey row to open an inline detail card. Two API calls fire in parallel: interaction/v1/eventDefinitions/{id} for entry source + schedule + criteria, and interaction/v1/interactions/{id}?extras=all for the activity count. Population is read directly from the search payload (stats.cumulativePopulation) — no extra fetch.
| Field | Source / Notes |
|---|---|
| Activities | Count of entries in activities[] with a non-null type field (matches SFMC's "Activity Count" badge) |
| Population | stats.cumulativePopulation — total contacts that have entered the journey |
| Entry Source | Trigger type chip + Data Extension name resolved from the event definition |
| Entry Criteria | metaData.criteriaDescription rendered as a wrapping code block — supports long AND/OR filter expressions |
| Schedule | Humanized from schedule object — "Hourly", "Every 2 days · 53 occurrences", "One-Time Schedule · Run On: 8/15/2025 10:30 AM IST", "No Schedule" |
| Audit Log | Top-right button — opens a timeline modal of every Create / Modify / Publish / Unpublish / Delete event for this journey, with user, timestamp, version, and publish status |
| Open in JB | Top-right button — opens Journey Builder in a new tab |
The eventDefinition's metaData.scheduleState field is unreliable — it reports "No Schedule" even when the schedule object is fully populated. The humanizer drives off schedule.frequency / schedule.startDateTime / scheduleFlowMode instead.
Audit Log Modal
Click the Audit Log button in the detail card header to pop a timeline modal of every lifecycle event for the journey. Same modal shell as the asset preview (backdrop blur, scale-in animation, Esc / click-outside to close). Available from both main search and DE Usage "Used in → Journeys".
- Summary strip at the top — colored action pills (e.g.
12 Modify · 4 Publish · 1 Create) + total events + unique editor count for a quick read - Vertical timeline below — left dot column color-coded by action; content column shows action name + version chip +
publishStatuspill (red onPublishFailed) + user + humanized timestamp - Cache per
interactionIdin a module-scopedMap— re-opens are instant
Endpoint: mc.{stack}.exacttarget.com/cloud/fuelapi/interaction/v1/interactions/{id}/audit/all — cookie-only proxy version of the documented marketingcloudapps.com/contactsmeta/fuelapi/... path. Works with session cookies alone, no CSRF needed.
SFMC's audit log exposes only five action types (create, modify, publish, unpublish, delete) — there is no dedicated activate action. In practice, the most recent Modify or Publish is usually the activator since SFMC locks a journey's current version from edits once it's activated. The modal surfaces this hint in its footer.
Status Colors
- Green — Published / Running (active journey)
- Amber — Draft / Paused / Unpublished
- Red — Stopped / Deleted
- Blue — ScheduledToRun / ScheduledToPublish
Reports
Reports open in a new browser tab as standalone self-contained HTML pages. Fully client-side — no server required. Each report ships with live filtering, sortable columns, theme switching, and a Download CSV button in the header that converts the embedded data to CSV without round-tripping back to the extension.
Available Reports
| Report | Columns | Enrichment |
|---|---|---|
| Automations | Name · Status · Key · Last Run · Schedule · Steps · Folder · Created By · Description · Created · Modified | Per-row hydration via legacy/v1/beta/bulk/automations/automation/definition/{id} for folder + automation/v1/automations/{id} for step count |
| Journeys | Name · Status · v · HTS · Trigger · Entry DE · Population · Channel · Modified | Bulk eventDefinitions fetch joined by eventDefinitionId to resolve Entry DE name; Population from stats.cumulativePopulation in the search payload |
| Assets | Name (clickable CDN link for files) · Type · Status · ID · Email ID · Customer Key · Folder · Created By · Created · Modified | Full folder breadcrumb resolved by walking parentId chain from a single /asset/v1/content/categories fetch; Email ID from data.email.legacy.legacyId |
| Activities | Name · Type Badge · Key · Target DE · Update Type · Folder · Description · Modified | Per-row hydration via ?view=categoryinfo on each of the 7 activity-type endpoints — yields folderLocationText and targetUpdateTypeName |
| Data Extensions | Name · Folder Path · ID · Key · Rows · Fields · Sendable · Sendable Field · Subscriber Field · Created · Created By · Modified · Modified By | Full DE inventory with parent-walked folder paths |
Report Features
- Download CSV (in-blob) — accent-filled button in the report header. UTF-8 BOM, proper escaping. Self-contained — the data is embedded in the HTML, conversion runs in the page's own JS.
- Live Filter — text input that narrows rows in real time
- Sortable Columns — click any column header to toggle ascending/descending
- Color-coded Badges — status colors match the panel
- Dark / Light Theme — server-side theme injection so the report opens correct on first paint
- Instance Metadata — report header shows SFMC instance, generation date, total count
- Scout Logo — branded report header
Generated reports are fully self-contained — all styles, data, and the CSV converter are inline. Save the HTML file to share with colleagues or keep as an audit snapshot. The Download CSV button continues to work even when offline because the data is embedded in the page.
Asset Report — Clickable CDN Links
For uploaded files (images, PDFs, fonts), the asset Name cell links to fileProperties.publishedURL so the report doubles as a one-click audit dashboard for production assets.
Snippets
The Snippets feature lets you save, organize, and re-deploy reusable code blocks (AMPscript, SSJS, SQL) across your SFMC work.
Snippet Storage
- Stored in
chrome.storage.local— persists across sessions - Each snippet has: label, language tag (ampscript / ssjs / sql), code body
- Syntax-highlighted preview in the panel
Ace Editor Deployment
Scout can detect open Ace editor instances on the current SFMC page (Cloud Pages, Script Activities) and inject snippet code directly into them:
- Navigate to a Cloud Page or Script Activity in SFMC
- Open Scout → Snippets
- Click Deploy on a snippet
injected_script.jslocates the active Ace editor instance- Code is inserted at the current cursor position
AceEditorHelper.js is injected directly into the page context (not the extension context) via injected_script.js. This is necessary because Ace editor instances live in the page's JavaScript memory, which the extension content script cannot directly access.
Security & Privacy
Data Handling
- No external transmission — all API calls go directly to SFMC's own servers using your browser session
- No credentials captured — Scout only reads CSRF tokens, never usernames or passwords
- Local storage only — tokens stored in
chrome.storage.local, scoped to your browser profile - Session-bound tokens — all tokens expire when your SFMC session ends
Permissions Justification
| Permission | Required For |
|---|---|
webRequest | Intercepting outgoing SFMC requests to capture CSRF tokens from response headers |
storage | Persisting tokens, theme preference, panel width, and snippets in chrome.storage.local |
tabs | Detecting the active SFMC tab to scope cached state and CSRF tokens per stack |
SFMC Scout is designed for developer and marketer use on accounts you are authorized to access. Never install on shared browser profiles or use to access SFMC accounts without authorization.
Limitations
Technical Constraints
- Active Session Required — All API calls require an active authenticated SFMC browser session
- Single Business Unit — Scout operates within the Business Unit of the currently active tab
- Chrome Only — MV3 extension architecture; not compatible with Firefox or Safari
- Rate Limits — SFMC API throttling applies; large-scale exports may take time
- No Write Operations (except DE Create) — Scout is primarily read-only; only DE creation modifies SFMC data
Known Limitations
- Ghost tab token refresh requires pop-up permission; blocked pop-ups may prevent token capture
- Ace editor deployment requires the editor to be visible and focused on the page
- Very large instances (10,000+ DEs) may hit browser memory limits during full export
- Journey detail view (step breakdown) is not available — only list view with status
SFMC Scout is an unofficial community tool, not supported by Salesforce. Use at your own risk in accordance with your organization's policies. Always maintain proper backups of SFMC configurations.
Troubleshooting
Token Issues
| Error | Cause | Solution |
|---|---|---|
| Token badges show red / missing | Tokens not yet captured (first load) | Click Refresh Tokens in panel header; Scout will open ghost tabs |
| 401 Unauthorized on API calls | Session token expired | Refresh the SFMC page to re-authenticate, then open Scout again |
| 403 EBADCSRFTOKEN | Wrong token used for endpoint | Token classification may be off; check Chrome DevTools console for token debug |
| Ghost tabs open but tokens never arrive | Pop-ups blocked by Chrome settings | Allow pop-ups for SFMC domains in Chrome settings, then retry |
Search Issues
| Issue | Cause | Fix |
|---|---|---|
| No search results returned | Token for entity type missing | Check token badges; refresh tokens if any show as missing |
| Results incomplete (e.g. only automations) | Some tokens not yet captured | Wait a moment; results stream in — scroll down to see all entity types |
Debug Steps
- Open Chrome DevTools (
F12) on the SFMC page - Check the Console tab for Scout log messages (prefixed with
[Scout]) - Inspect the extension service worker at
chrome://extensions/→ SFMC Scout → Service Worker - Check
chrome.storage.localfor stored token values - Verify your SFMC session is active and not timed out
The extension includes a debug.html utility page for inspecting token state. Open it via chrome-extension://[extension-id]/debug.html.
Technical Specifications
Extension Details
| Property | Value |
|---|---|
| Version | 2.1.0 |
| Manifest Version | 3 (MV3) |
| Architecture | Cookie-only proxy — no per-section CSRF tokens, no ghost tabs |
| Content Script | content.js (single file, no build step) |
| Background Worker | ES Module service worker (background.js) |
| Handler Modules | ~30 files across handlers/, services/, utils/, core/ |
| Host Permissions | *.exacttarget.com, *.marketingcloudapps.com |
| Permissions | storage, webRequest, tabs |
| Default Theme | Light (toggle persisted in chrome.storage.local) |
| Panel Width | 440–1100px (default 660px, drag-resizable, persisted) |
| Dependencies | None (vanilla JavaScript, inline SVG icons) |
Supported SFMC Stacks
| Stack Format | Example URL |
|---|---|
| mc.s1 – mc.s51 | mc.s51.exacttarget.com |
| Custom stacks | Detected automatically from window.location.hostname |
Browser Compatibility
- Chrome 100+ (primary supported browser)
- Edge 100+ (Chromium-based)
- Firefox (MV3 support incomplete — not recommended)
- Safari (MV3 extension API not supported)
SFMC Scout requires no build tooling. All modules are loaded natively via Chrome's ES Module support in MV3 service workers. Load unpacked and use immediately.