How It Works
- Client and Artifact Discovery: The Runlayer CLI checks known installation signals, MCP configuration files, skill artifacts, client-native agent definitions, and installed plugin artifacts
- Runtime Process Discovery (optional): Detect polls the process table and listening sockets, then correlates running AI clients, MCP servers, and agents with configured artifacts
- Secure Submission: Client presence, configuration, skill, agent-definition, plugin, and redacted runtime metadata is securely submitted to Runlayer
- Classification: Runlayer classifies each discovery:
- AI Clients are classified as:
- Managed: Approved through your organization’s client allowlist
- Shadow: Detected but not approved (flagged for review)
- Risk: Client presence uses a Low baseline risk; review its device, user, version, and detection evidence for context
- MCP Servers are classified as:
- Managed: Running through Runlayer (approved and monitored)
- Shadow: Configured outside Runlayer (flagged for review)
- Skills are classified as:
- Managed: Published and managed through Runlayer
- Shadow: Installed outside organizational control (flagged for review)
- Outdated: Previously managed but now out of date
- Skill Risk Levels: Each discovered skill is assigned a risk level:
- High: Skill contains risky instructions (prompt injection, data exfiltration patterns)
- Medium: Skill has potentially risky characteristics that warrant review
- Low: Skill has minor concerns but is unlikely to pose a threat
- Minimal: Skill appears safe with no concerning patterns detected
- AI Clients are classified as:
- Review: Newly discovered shadow clients, servers, skills, agents, and plugins are flagged for review on the Shadow AI page
Security Team Workflow
Discovery and Inventory
Discovery and Inventory
- Get visibility into supported AI clients, MCP servers, skills, and plugins across your organization
- Identify which AI tools employees are using, even when no MCP server is configured
- Build an inventory of shadow clients, integrations, and skills for risk assessment
- Track trends in AI client, MCP, and skill adoption over time
Server Risk Assessment
Server Risk Assessment
When shadow MCP servers are discovered, evaluate:
- Source: Is the MCP from a known vendor or unknown source?
- Permissions: What data and systems can it access?
- User context: Who configured it and for what purpose?
- Network exposure: Does it connect to external endpoints?
Skill Risk Assessment
Skill Risk Assessment
When shadow skills are discovered, evaluate:
- Risk level: Is the skill flagged as High or Medium risk?
- Instructions: Does the skill contain prompts that could manipulate AI behavior?
- Source: Is the skill from a trusted repository or an unknown source?
- Scope: What actions does the skill instruct the AI to perform?
Response Actions
Response Actions
Based on risk assessment:
- Low risk: Migrate to Runlayer-managed server or skill for visibility
- Medium risk: Require user to submit for approval review
- High risk: Take immediate action through MDM policy or direct intervention. If you suspect malicious activity, follow your incident response process, including credential rotation and forensic review as appropriate.
AI Client Detection
Detect inventories a supported AI client independently of its configured artifacts. A client can therefore appear in the Shadow AI inventory even when it has zero MCP servers, skills, or plugins. Detection evidence has three strengths:- Installed (
app,cli,registry,npm_global,pip_global): an application bundle, executable, operating-system installation record, or validated allowlisted npm/Python package - Configuration (
config): an exact known client configuration file - Weak trace (
trace): a known parent or state directory exists, but no exact configuration file was found. Runlayer-created hook files are excluded so installing AI Watch hooks cannot create client presence by itself.
- macOS: app bundles in
/Applicationsor~/Applications - Windows: uninstall-registry entries, per-user Microsoft Store/MSIX package registrations, or known installation paths
- Linux: binaries in known executable paths or desktop files
- All platforms: known configuration or state paths
- VS Code extensions: per-user installs plus built-in extensions from standard Visual Studio Code and Insiders installations and remote-server bundles. This includes GitHub Copilot as shipped with VS Code 1.116 and later; first-party VS Code platform extensions are excluded.
- Global npm installs: known client packages installed globally through npm — including under custom or renamed npm prefixes and
node_modulesdirectories found by bounded project and hidden-space sweeps. Detect reads package metadata only — it never runs npm, Node, package scripts, or shims. - Python tool installs: known client packages installed as Python tools, identified by exact distribution metadata in active, pipx, uv tool, user-site, conventional system-site, and sweep-discovered virtual environments. Renaming the console script or relocating the environment does not change this identity. Detect never imports packages or runs Python tools.
- Containers: client artifacts discovered inside running Docker, Podman, nerdctl, or k3s containers. Known MCP images remain identifiable even if they are renamed locally.
- Artifact evidence: a discovered MCP server, skill, agent definition, plugin, or extension also confirms that its client is present
app, cli, registry, npm_global, pip_global, container, config, trace, server, skill, plugin, or extension. Container and artifact methods (server, skill, plugin, extension) identify the client through discoveries made elsewhere in the same scan. New clients default to Shadow. Administrators can add an approved client to the organization allowlist from the Shadow AI Details tab or from the dedicated Settings → AI client allowlist page, marking it Managed and removing it from the shadow inventory. The AI client allowlist settings page provides a central view of all allowlisted clients and lets you add or remove clients without navigating through scan results.
Capabilities
Detect also records what an installed client can do when the proof is on disk. Each capability appears as a chip on the client’s Shadow AI detail and is re-evaluated on every scan: turning the feature off clears the chip on the next scan; a scan from an AI Watch version without capability probes, or one that could not read a marker file or a directory it had to list, leaves recorded chips unchanged; and an installation that has gone stale no longer contributes. On a Windows device with WSL, a client that ships a command-line binary (such as Claude Code) is also probed inside each WSL user home, so one that lives only in a distro is probed where it lives; desktop-only clients are probed on the Windows side alone.Runtime process discovery
Runtime process discovery is an optional Detect channel, disabled by default. When enabled, each scan polls the local process table and listening sockets. It identifies supported AI clients, MCP server processes, and agent frameworks, including loopback MCP servers discovered from their listening ports. Detect correlates each runtime sighting with the artifacts discovered from static configuration. In Shadow AI → Details, the Liveness column and filter distinguish:- Running: a configured artifact was observed running during the selected date range
- Configured only: configuration exists, but no running process was observed during the selected date range
- Runtime only: a high-confidence running process has no matching configuration
--detect-processes.
Process discovery is a point-in-time snapshot. It recognizes transient npx, uvx, pnpm dlx, and bunx MCP launchers while they are alive, but a command that starts and exits between scheduled scans is not observable. Renamed clients can still be recognized while running; installed extensions and home-relative MCP configurations remain the static backstop.
Supported Clients
For each OS, the tables below list the clients whose MCP, skill, and plugin artifacts Detect scans. Detect also reports the client itself when it finds an installation signal. A— means the client has no concept of that artifact type, so there is nothing to scan; see What — means below.
macOS
Windows
Linux
Presence-only clients
Detect also inventories these clients from installation signals even when no supported MCP configuration is present. Artifact support varies by client: Ollama, LM Studio, Jan, Cherry Studio, Msty, GPT4All, AnythingLLM, ChatWise, ChatGPT Desktop, Microsoft Copilot, Perplexity, Raycast, Replit Desktop, Continue, Amazon Q, Tabnine, Kiro, Trae, TraeWork, Qoder, Void, Aider, Amp, Crush, Droid, Qwen Code, OpenHands, Auggie, Grok Bot, Muse, Hermes, ZeroClaw, NanoClaw, NemoClaw, OpenFang, IronClaw, QwenPaw, Paperclip, LobsterAI, ClawX, Cline Desktop, CodeRabbit CLI, Jules Tools, Docker Agent, Qodo CLI, DeepSeek Harness, NextChat, Free Code, Groq Code CLI, mini-SWE-agent, Smithery CLI, MCP Inspector, Everything MCP Server, Filesystem MCP Server, Memory MCP Server, Sequential Thinking MCP Server, Fetch MCP Server, Git MCP Server, Time MCP Server, GitHub Copilot for Eclipse, Gemini, IntelliJ IDEA Community, Manus, UI-TARS Desktop, Highlight, Agent! (AgentiLoop), Fazm, Peekaboo, rabbit agent, Browser Use, Skyvern, Cua, Agent S, and OpenAdapt. Presence depends on an applicable signal on the device’s operating system. For example, OpenHands on Windows is detected through WSL. Computer-use agents are inventoried the same way. Manus, UI-TARS Desktop, Highlight, Agent! (AgentiLoop), Fazm, Peekaboo and the rabbit OS3 agent, and the pip- or npm-installed Browser Use, Skyvern, Cua, Agent S and OpenAdapt, let a cloud or local model watch the screen and drive the browser, keyboard and mouse, so their presence alone is the finding: Detect reports the installation from the app bundle, Store package, install path, package metadata or per-user state directory, and does not read their screenshots, recordings or sessions. Projects that embed Browser Use as a library are also classified as agent definitions.AI browsers
Detect inventories standalone AI-first browsers from installation records only: the app’s bundle identifier on macOS, the uninstall entry’s exact name and publisher or the browser’s own install path on Windows, and the package’s desktop entry on Linux. A browser profile, browsing history, or a running process never counts as an installation, and Detect does not read browsing data. Portable builds that can live anywhere, such as a standalone AppImage, are not probed.
In this table,
— means Detect has no verified installer identity for that operating system, either because the browser does not ship there or because its installer could not be verified. Installation does not show whether the browser’s AI features are used.
What — means
A — indicates the client has no equivalent of that artifact type, so there is nothing for Detect to scan — it is not a gap in Detect coverage.
- No skills convention (Gemini CLI, Antigravity): these clients do not define a
SKILL.mddirectory layout. MCP servers and, where applicable, plugins/extensions are still scanned. - No plugin marketplace (Claude Desktop, Goose, Zed, Cline, Antigravity, Warp, Pi Coding Agent, Kilo Code): these clients do not have a separate plugin/extension format that bundles MCP servers, so there is no plugin layer beyond the MCP server config itself. For Goose and Zed, extensions are the MCP server and are surfaced through the MCP Servers column. Pi packages can ship extensions and skills but cannot declare MCP servers. Kilo Code marketplace entries are written straight into the MCP config files Detect already reads, so they surface through the MCP Servers column.
- Gemini CLI stopped serving free, Google AI Pro, and Google AI Ultra users on June 18, 2026, when Google replaced it with the Antigravity CLI. Gemini Code Assist Standard and Enterprise licenses and paid API keys still work, so a Gemini CLI finding today is either an enterprise-licensed install or a stale one. Antigravity is reported as its own client.
- Antigravity MCP servers are read from the current global file (
~/.gemini/config/mcp_config.json), the pre-2.0 file (~/.gemini/antigravity/mcp_config.json), and the workspace file (.agents/mcp_config.json). Antigravity usesserverUrlfor remote servers; Detect reports it like any other remote endpoint. - Grok CLI (Grok Build) MCP servers are read from
~/.grok/config.toml, the enterprisemanaged_config.toml(user home or/etc/grok), and the project.grok/config.toml. Grok’s skills and plugin layers are not scanned yet. - Personal agents (Nanobot, ZeroClaw, PicoClaw, NanoClaw, NemoClaw, OpenFang, IronClaw, NullClaw, QwenPaw, Paperclip, LobsterAI, ClawX): the always-on “claw” family bridges Telegram, WhatsApp, Slack, iMessage and WeChat to a shell and MCP tools, and several ship with the shell on and sandboxing off. Detect reports each from its state directory, config or service file, binary or app bundle. Nanobot, PicoClaw and NullClaw MCP servers are read from their JSON configs; the others keep MCP in layouts not yet verified. LobsterAI and ClawX embed OpenClaw: ClawX shares
~/.openclaw, so its servers surface under OpenClaw and only the ClawX app bundle names it, while LobsterAI keeps its runtime under its own application-support folder. Gateway ports are not used as signals because the family shares and reuses them. - Vendor coding agents (Mistral Vibe, Rovo Dev CLI, Cortex Code, Command Code, Letta Code, Blackbox CLI, pool, Rowboat, Eigent, Verdent, Cline Desktop, CodeRabbit CLI, Jules Tools, Docker Agent, Qodo CLI): agents that vendors ship into seats customers already pay for. Mistral Vibe keeps servers as a TOML array of tables in
~/.vibe/config.tomland the project.vibe/config.toml; Rovo Dev CLI reads~/.rovodev/mcp.json; Cortex Code reads~/.snowflake/cortex/mcp.json; Command Code reads~/.commandcode/mcp.jsonplus the project.mcp.json; Letta Code keeps per-agent server lists in~/.letta/settings.json; Blackbox CLI readssettings.jsonat user, project and system scope; pool reads~/.config/poolside/settings.yamland the project.poolside/settings*.yaml; Rowboat, Eigent and Verdent keepmcp.jsonunder their own home directories. Entries a client marks disabled are not inventoried. Cline Desktop shares the Cline CLI’s settings file, so its servers surface under Cline CLI. CodeRabbit CLI, Jules Tools and the current Qodo CLI have no on-device MCP configuration. Docker Agent declares MCP servers inside agent YAML files, which Detect does not read yet, and it is present on every Docker Desktop 4.63+ install. - Vendor coding agents, wave 2 (CodeBuddy Code, iFlow CLI, Comate Zulu, MiniMax Code, MiMo Code, ZCode, DeepCode CLI, Kimi Desktop, Chatbox, DeepSeek Harness, NextChat): Claude-Code-shaped CLIs and desktop agents whose default endpoints are in China. CodeBuddy Code reads
~/.codebuddy/.mcp.json(plus the deprecatedmcp.jsonand legacy~/.codebuddy.json); iFlow CLI readsmcpServersfromsettings.jsonat user, project and system scope; Comate Zulu reads~/.comate/mcp.jsonand the project.comate/mcp(.local).json, which the Comate IDE plugins share; MiniMax Code reads~/.minimax/mcp.json; MiMo Code keeps OpenCode’smcpkey in~/.config/mimocode/mimocode.jsonc; ZCode readsmcp.serversfrom~/.zcode/cli/config.jsonand the workspace.zcode/config.json; DeepCode CLI reads~/.deepcode/settings.json; Kimi Desktop reads themcp.jsonof its embedded Kimi Code runtime under the app’s data directory; Chatbox readssettings.mcp.serversfrom itsconfig.json. ZCode and Chatbox entries switched off in their own config are not inventoried; the standard-shaped clients report switched-off servers like every other standard client. CodeBuddy Code and MiniMax Code share Claude Code’s project.mcp.json, so those servers are attributed to them only when the client is installed. DeepSeek Harness keeps MCP servers as plugin entries in YAMLcordis.patch.ymlfiles, which Detect does not read yet, and NextChat’s desktop build has no on-device MCP configuration. - Open-source coding harnesses and forks (Claw Code, Claurst, Free Code, Kode, jcode, Codebuff, Every Code, oh-my-pi, Oh My OpenAgent, ForgeCode, Nanocoder, Neovate Code, Groq Code CLI, Open Interpreter, Codewhale, Reasonix, Deep Agents Code, Prime Agent, gptme, Ante, Orca (echoVic), mini-SWE-agent): community agents, several of them forks or re-wraps of Claude Code, Codex and Pi that reuse the host’s configuration. Detect applies one attribution rule to all of them: the host keeps every server and skill in the files it owns, and the fork is reported only from its own binary, package or state directory. Free Code, which reads and writes only Claude Code’s files, is therefore presence-only; Kode, jcode, oh-my-pi, Oh My OpenAgent, Every Code, Reasonix, ForgeCode, Nanocoder and Deep Agents Code have their own MCP files inventoried while the Claude Code, Codex, OpenCode, Cursor, Windsurf and VS Code files they also read stay with those clients, and the shared project
.mcp.jsonis reported under Claude Code only. Claw Code readsmcpServersfrom~/.claw.json,~/.claw/settings.jsonand the project.claw.jsonand.claw/settings*.json; Claurst reads theconfig.mcp_serversarray insettings.jsonunder~/.config/claurst(or a pre-existing~/.claurst) and the project.claurst/settings.json(c); Kode reads~/.kode.jsonand the project.mcprc; jcode reads~/.jcode/mcp.jsonand the project.jcode/mcp.json; Codebuff reads~/.agents/mcp.jsonand the project.agents/mcp.json; Every Code and Open Interpreter read Codex-shapedconfig.tomlfiles under~/.codeand~/.openinterpreter; oh-my-pi reads~/.omp/agent/mcp.jsonand the project.omp/mcp.json; Oh My OpenAgent reads~/.omo/agent/mcp.jsonand the project.omo/mcp.json; ForgeCode reads~/.forge/.mcp.json; Nanocoder reads.mcp.jsonunder its config directory; Neovate Code reads~/.neovate/config.jsonand the project.neovate/config*.json; Codewhale reads~/.codewhale/mcp.json(legacy~/.deepseek/mcp.json) and the project.codewhale/mcp.json; Reasonix reads[[plugins]]tables in~/.reasonix/config.toml; Deep Agents Code reads~/.deepagents/.mcp.jsonand the project.deepagents/.mcp.json; Prime Agent reads~/.prime/agent/settings.jsonand the project.prime/agent/settings.json; gptme reads[[mcp.servers]]tables in itsconfig.toml; Ante reads~/.ante/settings.json; Orca (echoVic, not Stably’s Orca) reads[[mcp_servers]]tables in~/.orca/config.toml. jcode, oh-my-pi, Oh My OpenAgent, Nanocoder, Prime Agent, gptme and Orca drop servers switched off in their own config; the other standard-shaped clients report switched-off servers like every other standard client. The skills directories these harnesses keep are not scanned yet. Free Code, Groq Code CLI and mini-SWE-agent have no on-device MCP configuration to read. - Known plugin gaps (Kimi Code, Devin CLI): Detect scans these clients’ MCP configuration and skills, but not their plugins or extensions.
- Warp MCP servers are discovered from both Warp’s configuration file and servers added through Warp’s in-app gallery. Both feed the MCP Servers column; a server found through more than one source is counted once.
- Kilo Code MCP servers are scanned from every config location Kilo reads at runtime — the current global (
~/.config/kilo/) and project (kilo.json/kilo.jsonc/.kilo/) files, plus the older VS Code extension-store settings file, which Kilo still loads. All feed the MCP Servers column. - Pi Coding Agent has no built-in MCP support. Its
mcp.jsonfiles are read by the communitypi-mcp-adapterextension, so they only exist once a user installs it. Detect scans them wherever they appear. - Devin CLI and Devin Desktop are two surfaces. The CLI keeps servers in
~/.config/devin/mcp_config.json. Devin Desktop (the renamed Windsurf) hosts two agents: Cascade, whose servers live in~/.codeium/windsurf/mcp_config.jsonand are reported under Windsurf, and Devin Local, which shares the CLI’s harness and configuration and is reported under Devin CLI. Installing Devin Desktop alone is therefore enough for a device to show Devin CLI as present, and one device can legitimately show both rows.
Shadow Skills Discovery
Detect discovers skill artifacts alongside MCP server configurations in the same scan. Each discovered skill is classified and assigned a risk level based on its content. Skills found in a client-specific directory (such as~/.claude/skills or ~/.codex/skills) are attributed to that client. Skills found in the shared .agents/skills directory are readable by several clients at once (VS Code, Goose, Zed, OpenCode, and others), so they are reported as shared rather than attributed to a single client.
Disguised skills in caches
Disguised-skill detection is off by default. For managed fleets, open Settings → AI Watch, select Manage settings for the deployment, and enable Detect disguised skills. For a manual scan, pass:--detect-disguised-skills.
Skill Classification
Risk Levels
Skills flagged as High or Medium risk warrant immediate attention from security teams.Shadow Plugins Discovery
Detect also discovers installed plugin artifacts alongside MCP servers and skills. Discovered plugins are classified using the same managed/shadow model:
The Shadow AI page and exports surface only recognized AI marketplace and browser extensions. Unrelated extensions may still be scanned and stored, but are excluded from these results even when Include managed is enabled.
Detect also inventories browser extensions from every Chrome, Edge, Brave, Chromium and Firefox profile on the device, including the Beta, Dev and Canary channels and the Snap and Flatpak installs on Linux. Each extension is reported with its store id, name, version, store (Chrome Web Store, Edge Add-ons or Firefox Add-ons), enabled state, install and update times, and an install scope:
global for a store install, policy for an admin force-install, external for a third-party installer, and unpacked for a sideloaded extension loaded from a local directory. Recognized AI extensions such as Claude in Chrome, the ChatGPT browser control, Perplexity, Grammarly, Browser MCP, the Playwright MCP Bridge and meeting recorders surface on the Shadow AI page; the rest are stored but excluded.
Detect also inventories Office add-ins from the manifests Office caches for each signed-in account: the shared Wef cache on Windows and each app’s sandbox container on macOS for Excel, Word, PowerPoint, Outlook and OneNote. Each add-in is reported with its manifest id, name, publisher, version and host application, appsource when the manifest carries a store listing id, and the install scope global for a cached install or unpacked for a manifest sideloaded into the macOS Documents/wef folder. Recognized AI add-ins such as Claude for Excel, Word, PowerPoint and Outlook and the ChatGPT add-in surface on the Shadow AI page; the rest are stored but excluded.
Plugin discoveries appear on the Shadow AI page alongside MCP server and skill data. Re-analysis also covers plugins — reclassifying them when catalog data changes.
Agent Discovery
Detect surfaces two agent-related artifact types on the Shadow AI Details tab:- Custom agent — a client-native agent definition file. Detect inventories these for Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot, OpenCode, and Goose. The same definition found in several places appears once, with each device, path, client, and container location visible as a separate sighting. Definition contents are parsed locally; Runlayer receives only bounded metadata, never the raw file.
- Agent — an agent framework observed on the device, for example through runtime process discovery. Use the Type filter on the Details tab to review these alongside clients, MCP servers, skills, and plugins.
Run Detect
TLS trust: The
runlayer CLI and MDM-deployed aiwatch binary verify HTTPS through the OS trust store — macOS Keychain (login + System), Windows certificate stores (Current User + Local Machine), and the Linux distro CA bundle (/etc/ssl/certs). Corporate root CAs pushed via MDM, GPO, or Intune are honored automatically with no extra config. If your corporate root is not installed system-wide and scans fail with CERTIFICATE_VERIFY_FAILED, see Troubleshooting for the CA bundle overrides.For managed fleets, use Deploy AI Watch. Detect is always enabled in the AI Watch package; the MDM configuration wizard controls endpoint Mode and Sessions. This page keeps manual testing on the Runlayer CLI path.
Manual installation
For testing, one-off verification, or custom workflows, install the CLI and run a scan directly. Step 1 — Install the Runlayer CLI:~/.local/bin (macOS/Linux) or %USERPROFILE%\.local\bin (Windows) is on PATH.
Step 2 — Verify the CLI is on PATH:
command not found, restart your terminal or run uv tool update-shell. See Troubleshooting for more details.
Step 3 — Authenticate:
You can authenticate interactively or with an organization API key.
Option A: Interactive login (simplest)
Option A: Interactive login (simplest)
~/.runlayer/config.yaml.Scans submitted with interactive login credentials will not be associated with any of the configuration cards on the Settings → MDM configuration page. Use an organization API key (Option B) if you need scan data linked to a specific configuration.
Option B: Organization API key (recommended for test devices)
Option B: Organization API key (recommended for test devices)
Create a Test Device configuration under Settings → MDM configuration → Add new → Test Device — the setup guide mints an organization API key with the Shadow AI Scan role and shows it once. Only a key minted this way links scan data to a configuration card. Store it in the CLI:You will be prompted to paste the key securely.
--detect-processes to poll running processes and listening sockets; this channel is off by default. Add --detect-containers to scan MCP server configurations, skill artifacts, and agent definitions inside running Docker, Podman, or nerdctl containers and k3s containers (on Linux, requires root), inventory running and stopped Docker, Podman, or nerdctl containers plus their local images, and scan WSL projects on Windows. Add --detect-disguised-skills to run the default-off, explicit-cache probe described above.
Custom scan scheduling
Use these modular components when you need custom scheduling outside the managed AI Watch package. Install the CLI as a tool (if not already installed):What the scan reads (and what it doesn’t)
Security and privacy reviewers usually want to know exactly what touches disk during a scan. Detect is a metadata-first configuration scanner, not a content crawler. Where it looks- The crawl is confined to the signed-in user’s home directory (
$HOMEon macOS/Linux,%USERPROFILE%on Windows). It does not walk system directories or other users’ homes. - Project-level discovery walks home to a bounded depth — default
--project-depth 7, with a--project-timeoutceiling of 60 seconds. Pass--no-projectsto skip project-level scanning entirely and only read the known global client config paths. - The scan caps its own CPU and memory footprint. Defaults are generous, so a normal scan is unaffected; the caps are tunable per deployment — see the tuning table for the MDM keys.
- High-noise and cache directories are skipped:
.git,venv/.venv,__pycache__,dist,build,target,vendor,Library/Caches,Library/Application Support,AppData,.Trash,tmp,.cache,.npm,.yarn, and plugin-install caches. Detect records boundednode_modulesdirectory locations for npm package validation but does not descend into their dependency trees. The default-off disguised-skill phase is a narrow exception for its explicit allowlisted cache subtrees only. - Symlinks are not followed out of the home tree. On Windows, the SYSTEM all-users scan additionally drops reparse points and verifies each hit’s real path stays inside the profile.
- Browser profiles are opened for their extension registry only: Chromium’s
Secure PreferencesandPreferences(extensions.settings), Firefox’sextensions.json, and a store-installed extension’s own locale file when its name is localized. History, cookies, sessions and site storage are never read, and a sideloaded extension’s directory is reported by path but not opened. - Office add-in caches are read for manifests only: Detect looks at a file’s first bytes and reads it whole only when it is an add-in manifest, skips the WebView2 browser profile Office keeps under the Windows cache entirely, and never fetches or reads the add-in’s web content.
- Detect reads process-table and local listening-socket metadata for classification and correlation. It does not read process memory or environment variables, capture packets, inspect network payloads, or proxy traffic.
- Command arguments are scrubbed of credentials, secret-looking tokens, and usernames before submission, and bounded in length. The complete unredacted command line is retained only as a one-way hash used for correlation.
- The process working directory is reduced to its scrubbed final project-directory name. For agent correlation, Detect may also submit a sanitized agent root path that preserves path shape while redacting home-directory usernames, URL credentials, and secret-looking segments. Raw command arguments and unredacted working directories are never submitted to Runlayer.
- AI clients: the normalized client identifier, display name, version when available, detection methods, and matched configuration or state paths
- MCP servers: parsed configuration metadata only — the server
command/args/url, the client name, and any project path where the config was found. Raw config files are not uploaded. - Skills and plugins: metadata plus bounded artifact text so Runlayer can risk-classify the skill or plugin. Text collection is capped at 1 MB per file and 5 MB per artifact; oversized files are skipped. Artifacts are deduplicated by fingerprint — once an artifact’s fingerprint is already known, later devices submit only the per-device installation record, not the file text again.
- Browser extensions: extension id, name, version, store, install scope, enabled state, install and update times, and the profile or sideload path. No extension code or page data is uploaded.
- Office add-ins: manifest id, name, publisher, version, host application, store listing presence, install scope, and the cached manifest path. Manifest content is not uploaded.
- Agent definitions: parsed name and description, client, scope, redacted path, project path, and content hash. Raw definition content is not uploaded.
- Runtime processes (when enabled): process kind, redacted executable and arguments, correlation hashes, listening ports and bind scope, confidence and detection source, a scrubbed project-directory name, and for agents a sanitized root path when available
Scope is defined by the home-directory boundary, not by a drive-type filter. Paths outside the home directory are never traversed, so a network share or removable drive mounted elsewhere on the system is not crawled — but there is no separate exclusion that skips a drive mounted under the home directory.
Viewing Results
After a scan, view discovered clients, servers, skills, agents, and plugins in the Runlayer dashboard:- Navigate to Shadow AI
- Open the Details tab and use the Type filter to narrow to Clients, MCP servers, Skills, Plugins, Agents, or Custom agents. Each row identifies the artifact, user, and device. Open a row to review versions and detection evidence, or add a client to your organization’s allowlist.
- The Overview tab shows discovery trends, including the shadow vs. managed breakdown over time
- The Activity tab shows a filterable log of AI Watch activity, such as hook events and observed MCP tool calls
- The Connectors tab shows the most common shadow servers, who runs them, and which MCP clients are in use
- The Skills tab shows shadow skills by risk level, classification breakdown (Shadow, Managed, Outdated), and discovery trends over time
- The Devices tab shows AI Watch fleet mode and health, Sessions health, OS versions, and tool versions across enrolled devices
User Attribution
Detect resolves device usernames to Runlayer users so discoveries appear under the right owner. Some usernames remain unresolved because of shared machines, contractor naming, directory gaps, or ambiguous matches. See User and Identity Mapping for the full resolution flow and the Settings → User mapping workflow.Related Resources
Endpoint modes
Monitor activity, apply Protect scanner and denylist decisions, or use Enforce deny-by-default governance
Deploy AI Watch
Install the package and configure endpoint Mode / Sessions
User and Identity Mapping
Resolve device usernames to Runlayer users
Responding to Discoveries
Security team response framework
Re-analyzing Classifications
Refresh server and skill classifications after changes
Troubleshooting
Common issues and solutions
FAQ
Pre-deployment, security-review, and operational questions