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.

What is SFMC Scout?

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.

What's new in v2.1

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

Developer Mode Required

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.

  1. Download or clone the repository
  2. Open Chrome and navigate to chrome://extensions/
  3. Enable Developer mode (toggle in the top-right corner)
  4. Click Load unpacked
  5. Select the SFMC_Scout/ folder (the one containing manifest.json)
  6. Verify the extension appears with the Scout icon
  7. Navigate to any SFMC page — the Scout toggle button will appear on the right edge of the screen

First Use

  1. Click the Scout tab on the right edge to open the panel
  2. On first open, Scout automatically captures tokens from your active session
  3. If tokens are missing, Scout opens minimized background tabs to trigger token capture
  4. Once all token badges show green, all features are available
SFMC Stack Support

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.

graph TB SFMC[SFMC Page DOM] CS[content.js — Panel UI + State] BG[background.js — Service Worker] HND[handlers/ — Search, DE, Automation, Journey] SVC[services/ — DE Create/Export/Import/Report] UTL[utils/ — API, Token, Instance, Storage] API[SFMC REST APIs] SFMC --> CS CS --> BG BG --> HND BG --> SVC BG --> UTL UTL --> API HND --> API SVC --> API style CS fill:#2563eb,stroke:#2563eb,color:#fff style BG fill:#1f7a3a,stroke:#1f7a3a,color:#fff style HND fill:#b06f00,stroke:#b06f00,color:#fff style SVC fill:#6b21a8,stroke:#6b21a8,color:#fff style API fill:#c0322a,stroke:#c0322a,color:#fff

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.

Ghost tabs eliminated

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

sequenceDiagram participant User participant Panel as Scout Panel participant BG as background.js participant Proxy as Cookie-only Proxy User->>Panel: Search M1_Test Panel->>BG: MAKE_REQUEST url method headers BG->>Proxy: fetch with credentials include Note over BG,Proxy: Browser attaches SFMC session cookies automatically Proxy-->>BG: JSON 200 OK BG-->>Panel: sendResponse results Panel->>Panel: Render results
Security boundaries

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.

graph LR A[User Action] --> B[content.js] B --> C{chrome.runtime\nsendMessage} C --> D[background.js] D --> E[Handler / Service] E --> F[SFMC REST API] F --> G[Response] G --> E E --> H[sendResponse] H --> B B --> I[Render UI] style A fill:#2563eb,stroke:#2563eb,color:#fff style I fill:#1f7a3a,stroke:#1f7a3a,color:#fff style F fill:#c0322a,stroke:#c0322a,color:#fff

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:

sequenceDiagram participant UI as content.js (UI) participant Port as chrome.runtime.Port participant SH as SearchService participant APIs as SFMC APIs UI->>Port: openPort('search') Port->>SH: searchAll(query, filter) SH->>APIs: Parallel fetch (Auto + Journey + DE + Asset + Activity) APIs-->>SH: Results stream in SH-->>Port: port.postMessage(results[]) Port-->>UI: onMessage → renderResults() Note over UI: Panel updates incrementally

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

EndpointMethodPurposeToken
/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

EndpointMethodPurposeToken
/cloud/fuelapi/interaction/v1/interactions/ GET List journeys (active + draft, with stats, trigger, tag) journeyToken

Data Extensions

EndpointMethodPurposeToken
/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)

EndpointMethodPurposeToken
/contactsmeta/fuelapi/asset/v1/content/assets GET Search Content Builder assets and emails cbToken

Activities (7 Types)

EndpointMethodActivity TypeToken
/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
Base URLs

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 TypeHeaderToken
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
Token Expiration

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.

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

StatusColorDescription
Active / RunningGreenAutomation is currently executing
ScheduledBlueWaiting for scheduled trigger
PausedYellowManually paused
ErrorRedLast run encountered an error
ReadyGreyIdle, 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
Syntax Highlighting

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:

  1. Basic Info — Name, Customer Key, description, sendable/testable flags, folder selection
  2. Fields — Add typed fields with name, type (Text, Number, Date, Boolean, etc.), length, required, primary key flags
  3. Review & Submit — Preview the full DE definition before creating
graph TD A[Step 1: Basic Info] --> B[Step 2: Add Fields] B --> C[Step 3: Review] C --> D{Confirm?} D -->|Yes| E[POST /customobjects] D -->|No| B E --> F{Success?} F -->|Yes| G[DE Created — Show Link] F -->|No| H[Show Error] style A fill:#1e40af style G fill:#065f46 style H fill:#991b1b

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.

Rate Limits

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)

PillSource
Statuscolor-coded — Published/Running (green), Draft/Paused/Unpublished (amber), Stopped/Deleted (red), Scheduled (blue)
vNcurrent version number
HTSmetaData.highThroughputSending.email — small blue pill when high-throughput sending is enabled
ChannelEmail, Mobile Push, etc.
Definition TypeMultistep / SingleSend / Transactional / Quicksend
Trigger TypeEmailAudience, 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.

FieldSource / Notes
ActivitiesCount of entries in activities[] with a non-null type field (matches SFMC's "Activity Count" badge)
Populationstats.cumulativePopulation — total contacts that have entered the journey
Entry SourceTrigger type chip + Data Extension name resolved from the event definition
Entry CriteriametaData.criteriaDescription rendered as a wrapping code block — supports long AND/OR filter expressions
ScheduleHumanized from schedule object — "Hourly", "Every 2 days · 53 occurrences", "One-Time Schedule · Run On: 8/15/2025 10:30 AM IST", "No Schedule"
Audit LogTop-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 JBTop-right button — opens Journey Builder in a new tab
Schedule resolution

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 + publishStatus pill (red on PublishFailed) + user + humanized timestamp
  • Cache per interactionId in a module-scoped Map — 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.

No "Activated" event

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

ReportColumnsEnrichment
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
Standalone HTML

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:

  1. Navigate to a Cloud Page or Script Activity in SFMC
  2. Open Scout → Snippets
  3. Click Deploy on a snippet
  4. injected_script.js locates the active Ace editor instance
  5. Code is inserted at the current cursor position
How Ace Injection Works

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

PermissionRequired For
webRequestIntercepting outgoing SFMC requests to capture CSRF tokens from response headers
storagePersisting tokens, theme preference, panel width, and snippets in chrome.storage.local
tabsDetecting the active SFMC tab to scope cached state and CSRF tokens per stack
Internal Use Only

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
Not Official

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

ErrorCauseSolution
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

IssueCauseFix
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

  1. Open Chrome DevTools (F12) on the SFMC page
  2. Check the Console tab for Scout log messages (prefixed with [Scout])
  3. Inspect the extension service worker at chrome://extensions/ → SFMC Scout → Service Worker
  4. Check chrome.storage.local for stored token values
  5. Verify your SFMC session is active and not timed out
Debug HTML

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

PropertyValue
Version2.1.0
Manifest Version3 (MV3)
ArchitectureCookie-only proxy — no per-section CSRF tokens, no ghost tabs
Content Scriptcontent.js (single file, no build step)
Background WorkerES Module service worker (background.js)
Handler Modules~30 files across handlers/, services/, utils/, core/
Host Permissions*.exacttarget.com, *.marketingcloudapps.com
Permissionsstorage, webRequest, tabs
Default ThemeLight (toggle persisted in chrome.storage.local)
Panel Width440–1100px (default 660px, drag-resizable, persisted)
DependenciesNone (vanilla JavaScript, inline SVG icons)

Supported SFMC Stacks

Stack FormatExample URL
mc.s1 – mc.s51mc.s51.exacttarget.com
Custom stacksDetected 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)
No Build Step

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.