개발자 환경을 스캔하여 AI agent, MCP server, IDE extension 및 의심스러운 패키지를 찾아내고 공급망 리스크를 식별합니다.
다른 이름 step-security/dev-machine-guard
- 스타
- 197
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- —
- 마지막 커밋
- 2026년 11월 14일
- 라이선스
- Apache-2.0
dev-machine-guard MCP란?
dev-machine-guard은(는) MCP server입니다. 개발자 환경을 스캔하여 AI agent, MCP server, IDE extension 및 의심스러운 패키지를 찾아내고 공급망 리스크를 식별합니다.
프로젝트 README에서 생성된 요약
dev-machine-guard MCP server 정보
dev-machine-guard의 주요 기능은 공급망 위협으로부터 개발자 워크스테이션을 보호하는 것입니다. 이 도구는 rogue MCP server, 검증되지 않은 AI agent, 악성 IDE extension과 같이 기존 보안 소프트웨어가 놓치기 쉬운 개발 도구 계층 내의 리스크를 식별합니다. macOS, Windows, Linux 전반에서 작동하며 패키지 매니저 설정을 감사하고 의심스러운 파일이나 침해 지표를 스캔합니다.
개발자는 로컬 커뮤니티 용도로 독립형 바이너리로 실행하거나 Jamf, Kandji, Intune과 같은 MDM 도구를 통해 전체 플릿에 배포할 수 있습니다. 스캐너는 JSON, HTML 보고서, 가독성 높은 터미널 텍스트를 포함한 다양한 출력 형식을 지원합니다. 기업 사용자는 configure 명령을 사용하여 API key와 엔드포인트를 설정할 수 있으며, send-telemetry 명령을 통해 스캔 결과를 중앙 대시보드에 업로드할 수 있습니다. 또한 Node.js, Homebrew, Python 환경에 대한 심층적인 가시성을 제공하여 패키지 무결성을 보장합니다.
활용 사례
- 1로컬 AI 도구 설정 감사개발자가 자신의 머신을 스캔하여 활성화된 모든 AI agent 및 MCP server 설정을 식별할 수 있습니다.
- 2패키지 매니저 보안 검증Node.js, Homebrew 또는 Python 패키지 매니저의 위험한 설정을 확인할 수 있습니다.
- 3CI 내 보안 점검 자동화JSON 출력을 활용하여 시스템에서 MCP server가 탐지될 경우 빌드를 실패하도록 설정할 수 있습니다.
- 4보안 준수 보고서 생성워크스테이션의 보안 상태를 요약하는 독립형 HTML 문서를 생성할 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
자동 검사
2026년 11월 13일에 실행됨전체 보고서 →아직 인증되지 않았습니다. 서버는 80점 이상의 점수, 심각한 결함 없음, 그리고 검사에 충분한 데이터를 갖추어야 합니다. 검사 방식 · 점수를 높이기 위해 수정할 항목
- 소스 저장소 연결 및 접근 가능step-security/dev-machine-guard is public and reachablegithub.com/step-security/dev-machine-guard ↗통과
- 패키지가 이 저장소를 소스로 명시검사되지 않음
- 빌드 출처(Sigstore 증명)검사되지 않음
- 오픈 소스 라이선스 (OSI)Apache-2.0spdx.org/licenses/Apache-2.0.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-12github.com/step-security/dev-machine-guard ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음검사되지 않음
- 패키지 및 해당 종속성에 중요한 보안 권고 없음검사되지 않음
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기Why Dev Machine Guard?
Developer machines are the new attack surface. They hold high-value assets — GitHub tokens, cloud credentials, SSH keys — and routinely execute untrusted code through dependencies and AI-powered tools. Recent supply chain attacks have shown that malicious VS Code extensions can steal credentials, rogue MCP servers can access your codebase, and compromised npm packages can exfiltrate secrets.
EDR and traditional MDM solutions monitor device posture and compliance, but they have zero visibility into the developer tooling layer:
| Capability | EDR / MDM | Dev Machine Guard |
|---|---|---|
| IDE extension audit | Yes | |
| AI agent & tool inventory | Yes | |
| MCP server config audit | Yes | |
| Package scanning (Node.js, Homebrew, Python, system) | Yes | |
| Package-manager config audit (registry, cooldown, auth) | Yes | |
| Suspicious file / IOC detection | Yes | |
| Cross-platform (macOS, Windows, Linux) | Yes | Yes |
| Device posture & compliance | Yes | |
| Malware / virus detection | Yes |
Dev Machine Guard is complementary to EDR/MDM — not a replacement. Deploy it alongside your existing tools via MDM (Jamf, Kandji, Intune) or run it standalone.
Quick Start
The steps below install the binary directly and are intended for community users evaluating Dev Machine Guard on a single machine.
Enterprise customers should not install the binary manually. Deploy Dev Machine Guard across your fleet using the loader script through your MDM or EDR tooling. See the Installation Script documentation for the supported, auto-updating deployment flow.
Install from release (community)
Download the latest binary for your platform from GitHub Releases. Release asset filenames embed the version (for example, stepsecurity-dev-machine-guard-1.19.1-darwin), so the snippets below resolve the latest tag first rather than hardcoding a version.
macOS (universal binary — Apple Silicon and Intel)
VERSION=$(curl -fsSL https://api.github.com/repos/step-security/dev-machine-guard/releases/latest | grep '"tag_name"' | cut -d'"' -f4 | sed 's/^v//')
curl -fsSL "https://github.com/step-security/dev-machine-guard/releases/download/v${VERSION}/stepsecurity-dev-machine-guard-${VERSION}-darwin" -o stepsecurity-dev-machine-guard
chmod +x stepsecurity-dev-machine-guard
# Run the scan
./stepsecurity-dev-machine-guard
Windows (PowerShell)
$version = (Invoke-RestMethod https://api.github.com/repos/step-security/dev-machine-guard/releases/latest).tag_name.TrimStart('v')
$arch = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { 'amd64' }
Invoke-WebRequest -Uri "https://github.com/step-security/dev-machine-guard/releases/download/v$version/stepsecurity-dev-machine-guard-$version-windows_$arch.exe" -OutFile "stepsecurity-dev-machine-guard.exe"
# Run the scan
.\stepsecurity-dev-machine-guard.exe
Linux
VERSION=$(curl -fsSL https://api.github.com/repos/step-security/dev-machine-guard/releases/latest | grep '"tag_name"' | cut -d'"' -f4 | sed 's/^v//')
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
curl -fsSL "https://github.com/step-security/dev-machine-guard/releases/download/v${VERSION}/stepsecurity-dev-machine-guard-${VERSION}-linux_${ARCH}" -o stepsecurity-dev-machine-guard
chmod +x stepsecurity-dev-machine-guard
# Run the scan
./stepsecurity-dev-machine-guard
Pre-built .deb and .rpm packages are also available on the releases page.
Build from source
git clone https://github.com/step-security/dev-machine-guard.git
cd dev-machine-guard
make build
./stepsecurity-dev-machine-guard
Requires Go 1.26+. The binary has zero external dependencies.
Usage
stepsecurity-dev-machine-guard [COMMAND] [OPTIONS]
Commands
| Command | Description |
|---|---|
| (none) | Run a scan (community mode, pretty output) |
configure |
Interactively set all settings (enterprise, scan, output) |
configure show |
Show current configuration (API key masked) |
install |
Install scheduled scanning — launchd (macOS), systemd (Linux), schtasks (Windows) |
uninstall |
Remove scheduled scanning configuration |
send-telemetry |
Upload scan results to the StepSecurity dashboard (enterprise) |
Output Formats
| Flag | Description |
|---|---|
--pretty |
Pretty terminal output (default) |
--json |
JSON output to stdout |
--html FILE |
Self-contained HTML report saved to FILE |
Options
| Flag | Description |
|---|---|
--search-dirs DIR [DIR...] |
Search DIRs instead of $HOME (replaces default; repeatable) |
--enable-npm-scan |
Enable Node.js package scanning |
--disable-npm-scan |
Disable Node.js package scanning |
--enable-brew-scan |
Enable Homebrew package scanning |
--disable-brew-scan |
Disable Homebrew package scanning |
--enable-python-scan |
Enable Python package scanning |
--disable-python-scan |
Disable Python package scanning |
--include-bundled-plugins |
Include bundled/platform IDE plugins in output |
--log-level=LEVEL |
Log level: error | warn | info | debug |
--verbose |
Shortcut for --log-level=debug |
--force-scan |
Scan now regardless of the dashboard cadence; still checks in |
--color=WHEN |
Color mode: auto | always | never (default: auto) |
-v, --version |
Show version |
-h, --help |
Show help |
Examples
# Pretty terminal output (default)
./stepsecurity-dev-machine-guard
# JSON output
./stepsecurity-dev-machine-guard --json
./stepsecurity-dev-machine-guard --json | python3 -m json.tool # formatted
./stepsecurity-dev-machine-guard --json > scan.json # to file
# HTML report
./stepsecurity-dev-machine-guard --html report.html
# Verbose scan with npm packages — shows progress spinners and timing
./stepsecurity-dev-machine-guard --verbose --enable-npm-scan
# Scan specific directories instead of $HOME
./stepsecurity-dev-machine-guard --search-dirs /Volumes/code
./stepsecurity-dev-machine-guard --search-dirs /tmp /opt # multiple dirs
# Pipe JSON through jq to extract just AI tools
./stepsecurity-dev-machine-guard --json | jq '.ai_agents_and_tools'
# Count IDE extensions
./stepsecurity-dev-machine-guard --json | jq '.summary.ide_extensions_count'
# Check for MCP configs (exit 1 if any found — useful in CI)
count=$(./stepsecurity-dev-machine-guard --json | jq '.summary.mcp_configs_count')
[ "$count" -gt 0 ] && echo "MCP servers detected!" && exit 1
# Disable colors for piping or logging
./stepsecurity-dev-machine-guard --color=never 2>&1 | tee scan.log
# Enterprise: configure all settings interactively
./stepsecurity-dev-machine-guard configure
# Enterprise: view saved configuration (API key masked)
./stepsecurity-dev-machine-guard configure show
# Enterprise: install scheduled scanning (launchd / systemd / schtasks)
./stepsecurity-dev-machine-guard install
# Enterprise: one-time telemetry upload
./stepsecurity-dev-machine-guard send-telemetry
# Enterprise: scan even when the dashboard-managed scan cadence says "not due"
# (equivalent env var: STEPSEC_FORCE_SCAN=1; disable gating: STEPSEC_DISABLE_RUN_GATE=1)
./stepsecurity-dev-machine-guard send-telemetry --force-scan
# Enterprise: remove scheduled scanning
./stepsecurity-dev-machine-guard uninstall
Configuration
Run configure to set up enterprise credentials and default search directories:
./stepsecurity-dev-machine-guard configure
This interactively prompts for all configurable settings:
| Setting | Description | Default |
|---|---|---|
| Device ID | Optional custom identifier for this device | Machine serial |
| Customer ID | Your StepSecurity customer identifier | (not set) |
| API Endpoint | StepSecurity backend URL | (not set) |
| API Key | Authentication key for telemetry uploads | (not set) |
| Scan Frequency | How often scheduled scans run (hours) | (not set) |
| Search Directories | Comma-separated list of directories to scan | $HOME |
| Enable NPM Scan | Node.js package scanning | auto |
| Enable Brew Scan | Homebrew package scanning | auto |
| Enable Python Scan | Python package scanning | auto |
| Color Mode | Terminal color output | auto |
| Output Format | Default output format | pretty |
| HTML Output File | Default path for HTML reports | (not set) |
| Log Level | Logging verbosity | error |
On an ephemeral device with no detected user identity (empty, unknown, or root), assign one once:
./stepsecurity-dev-machine-guard configure --non-interactive --user-id employee-123
This does not require enterprise credentials. The ID uses 1–256 ASCII letters, digits, or @ . _ + -; surrounding whitespace is trimmed, control characters are rejected, and unknown/root are reserved regardless of case. An ID-only JSON import such as {"user_id":"employee-123"} also works through configure --from-file PATH.
An existing detected email or regular OS username prevents assignment. Once assigned, scans and hooks use the stored ID even if automatic detection changes. Repeating the same value succeeds; replacing or clearing it fails without changing configuration. Other configure operations preserve it. The guarantee applies to the existing configuration scope; the config file owner can still edit or remove files directly. Provision after cloning an ephemeral image to avoid copying an assigned identity to every clone.
When no user identity is available, scanning continues as unknown with a warning and remains eligible for later assignment. Enterprise telemetry includes explicit user_id_missing and device_id_missing booleans based on the resolved identities, including false values. OS login state (no_user_logged_in) is detected independently of attribution. Backend handling of missing device IDs requires deployment verification.
View current settings:
./stepsecurity-dev-machine-guard configure show
Configuration (~/.stepsecurity/config.json):
Customer ID: my-company
API Endpoint: https://api.stepsecurity.io
API Key: ***a1b2
Scan Frequency: 4 hours
Search Directories: $HOME, /Volumes/code
Enable NPM Scan: auto
Enable Brew Scan: auto
Enable Python Scan: auto
Color Mode: auto
Output Format: pretty
Log Level: error
Configuration is saved to ~/.stepsecurity/config.json with 0600 permissions (owner read/write only).
To label a device for the dashboard, add "device_tag": "avd-pool-eu" to the
config JSON, pass configure --device-tag avd-pool-eu, or use the MSI
DEVICETAG property. The tag is set in the agent configuration only (the
dashboard shows it and never edits it). In the dashboard's Device activity
settings an admin can limit retirement (on uninstall, by inactivity and from
the dashboard) to devices carrying chosen tags; the default applies it to all
devices.
To use a custom device ID, add "device_id": "my-device-123" to the existing
config JSON, set Device ID through configure, or pass
configure --device-id my-device-123. The override is also
supported in JSON supplied to configure --from-file. A literal device ID
must follow the ID format above; empty or whitespace-only inputs are rejected.
An absent saved override uses the machine serial as before. To reset an
existing override, enter - at the interactive Device ID prompt or pass
--device-id -. The agent continues
reporting the actual machine serial in serial_number. WSL guest scans derive
separate IDs from the host ID and distro ID.
Choose an ID unique within your customer and keep it stable: changing the ID registers a separate device in the backend; it does not migrate existing history.
The value may also be a template over {serial} and {hostname} (for
example {hostname} on pooled virtual desktops rebuilt under stable names, so
a rebuilt host keeps its device and history), and the STEPSEC_DEVICE_ID
environment variable overrides it at run time. A device is always the machine:
on a shared Windows host (a multi-session edition or the RD Session Host role;
with multi_user_detection: users, also one where two developers have each
scanned on two different days) every signed-in session runs its own scan and
reports under the same device with its own user_identity and user_token,
and the dashboard lists the users inside the device; multi_user_detection: off keeps one scan per tick. identity --json prints the identity a machine
reports under. Every scan also reports whether the machine is virtual or
physical and on which hypervisor or cloud. See
docs/deploying-on-virtual-desktops.md.
Every setting can also be written without prompts, which is how MDM, MSI and
CI deployments configure the agent. Any setting flag passed to configure
selects the no-prompt path; settings you don't pass keep their current value.
Credentials are required only when the command sets one of them, passes
--from-file, or sets nothing at all, so a community install can change
preferences (configure --color=never) without them:
./stepsecurity-dev-machine-guard configure --non-interactive \
--customer-id my-company --api-endpoint https://api.stepsecurity.io \
--device-id my-device-123 --scan-frequency 4 --search-dirs /Volumes/code \
--disable-brew-scan --log-level=info
| Setting | configure flag |
|---|---|
| User ID (one-time) | --user-id ID (only when no usable identity is detected) |
| Device ID | --device-id VALUE (a literal, or a template over {serial} {hostname}; - clears) |
| Device tag | --device-tag TAG (- clears) |
| Retire on uninstall | --retire-on-uninstall[=BOOL] |
| Multi-user detection | --multi-user-detection MODE (edition, users, off; - clears) |
| Customer ID | --customer-id ID |
| API Endpoint | --api-endpoint URL |
| API Key | --api-key KEY (or DMG_API_KEY env var) |
| Scan Frequency | --scan-frequency HOURS |
| Max Execution Duration | --max-execution-duration 2h (off to disable) |
| Search Directories | --search-dirs DIR... |
| NPM / Brew / Python / runtime scan | --enable-<x>-scan / --disable-<x>-scan |
| Node / Python scanner | --legacy-node-scan / --disk-node-scan, --legacy-python-scan / --disk-python-scan |
| macOS TCC-protected dirs | --include-tcc-protected / --no-include-tcc-protected |
| macOS network volumes | --include-network-volumes / --no-include-network-volumes |
| Color Mode | --color=auto|always|never |
| Output Format / HTML file | --pretty, --json, --html FILE |
| Log Level | --log-level=LEVEL |
| Install Directory | --install-dir DIR |
| Self-update | --auto-update=BOOL, --update-mirror-url URL, --update-lag-behind N, --update-cooldown-hours N |
| Everything at once | --from-file config.json (flags override the file) |
CLI flags always override config file values — this matches the shell script behavior. For example, if your config has output_format: json, running ./stepsecurity-dev-machine-guard --pretty uses pretty output. To clear a value during configuration, enter a single dash (-).
Logging and Verbose Mode
By default in community mode, progress messages (spinners, step details) are suppressed — you only see the final output. This keeps stdout clean for piping.
# Default: quiet — clean output, no progress spinners
./stepsecurity-dev-machine-guard --json > scan.json
# Verbose: show progress spinners and step timing
./stepsecurity-dev-machine-guard --verbose
# Fine-grained control: set log level
./stepsecurity-dev-machine-guard --log-level=info
# Save log level in config so it persists across runs
./stepsecurity-dev-machine-guard configure
In enterprise mode (send-telemetry, install), progress is always shown regardless of the log level — the output is captured as execution logs and sent to the backend for debugging.
dev-machine-guard MCP 질문
Dev Machine Guard가 EDR이나 MDM을 대체할 수 있나요?
아니요, 기존 보안 솔루션이 놓치기 쉬운 개발 도구 계층에 대한 가시성을 제공함으로써 EDR/MDM을 보완하도록 설계되었습니다.
기업 고객은 이 도구를 어떻게 배포할 수 있나요?
기업 고객은 바이너리를 수동으로 설치하는 대신 MDM 또는 EDR 도구를 통해 로더 스크립트를 사용해야 합니다.
지원되는 운영 체제는 무엇인가요?
이 도구는 크로스 플랫폼을 지원하며 macOS, Windows, Linux에서 사용할 수 있습니다.
홈 디렉터리 대신 특정 디렉터리만 스캔할 수 있나요?
네, --search-dirs 플래그를 사용하여 스캔할 디렉터리를 지정할 수 있습니다.