Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Local-first defensive scanner for vulnerable dependencies, leaked secrets, and risky agent configs
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"husk": {
"command": "npx",
"args": [
"-y",
"husk-sec",
"mcp"
]
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add husk -- npx -y husk-sec mcp프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"husk": {
"command": "npx",
"args": [
"-y",
"husk-sec",
"mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"husk": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"husk-sec",
"mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 husk-security 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.2)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Node.js, Rust도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, Python MCP
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Local-only Python MCP server for the Files.com API.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
A local-first security scanner for developers. One binary, no account.
Install · Quickstart · Usage · Commands · How it works
husk scans your machine for compromised packages, leaked secrets, risky install scripts, and unsafe AI/MCP configuration, then shows you what to fix. It runs locally: no login, no account, no file ever leaves your machine. An online scan sends only package names, versions, and CVE ids to public advisory databases (OSV.dev, npm, PyPI, GitHub, CISA KEV / FIRST EPSS); --offline makes zero network calls.
Pre-1.0 software without an independent audit. Interfaces can change
between releases. Bug reports and questions are welcome in
husk runs on Linux and macOS. On Windows, run it inside WSL, where it installs and behaves exactly as it does on Linux. There is no native Windows build.
Download the latest signed release, verify its checksum, and install it:
curl -fsSL https://husk-security.dev/install.sh | sh
It installs to ~/.local/bin, overridable with HUSK_INSTALL_DIR or --install-dir. If that directory is not already on your PATH, it asks before adding it to your shell's startup file and names the exact file it would change. Decline, or run it without a terminal, and it prints the one command that adds it instead. --no-modify-path never writes to a startup file at all.
Prefer not to pipe into a shell? Download install.sh, read it, then run it. Every release is cosign-signed and SLSA-attested; the installer verifies the SHA-256 checksum (and the signature too, when cosign is on your PATH). See verifying a release.
Other install sources
| Source | Command |
| --- | --- |
| cargo |
cargo install husk-sec|
| cargo-binstall |
cargo binstall husk-sec|
| npm |
npm install -g husk-sec|
Nix
Run it without installing anything:
`sh
nix run github:husk-security/husk -- scan
`
The flake exposes two packages:
husk(the default, with the localhost web
UI) and
husk-tui(the same binary without it, so it needs no Node
toolchain).
For persistent use, add the flake as an input and put the package in your
configuration. NixOS:
`nix
{
inputs.husk.url = "github:husk-security/husk";
inputs.husk.inputs.nixpkgs.follows = "nixpkgs";
outputs = { nixpkgs, husk, ... }: {
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
{ environment.systemPackages = [ husk.packages.x86_64-linux.husk ]; }
];
};
};
}
`
Home Manager, with the same input:
`nix
home.packages = [ husk.packages.x86_64-linux.husk ];
`
If you would rather put it on
PATHimperatively than declare it,
nix profile install github:husk-security/huskalso works.
husk # print help (no subcommand does nothing else)
husk scan # one-shot scan of the current directory, plain terminal summary husk web # serve the local web UI and open it in your browser husk tui # browse the latest scan in the terminal UI
husk with no subcommand prints help and exits, like git or cargo. The entry points are husk scan (scan and print the report), husk web (the local web UI, opened in your browser), and husk tui (the terminal UI).
A few of the commands you'll actually run day to day. The full list (every subcommand and flag) is in the command reference.
Scan a directory and print the findings report:
$ husk scan --offline .
packages: 286 findings: 36 critical: 5 high: 16 medium: 15 low: 0 info: 0
critical risky-agent-config AI agent is allowed unrestricted shell access .claude/settings.local.json:4 high lifecycle-script Dangerous npm postinstall script package.json:6 high risky-agent-config MCP config contains hardcoded secret .mcp.json:7 ...
Vet one package before you install it (a live OSV.dev lookup):
$ husk check lodash@4.17.20
!! vulnerable npm lodash@4.17.20 advisory GHSA-35jh-r3h4-6jhm via OSV.dev Command Injection in lodash Install a fixed version instead, or avoid the dependency until one is available.
The version can be an @version suffix (split on the last @, so @scope/pkg@1.2.3 works) or separate arguments: husk check npm lodash 4.17.20. A bare name (husk check lodash) assumes npm and checks malware advisories only.
Protect normal and lockfile installs with the tracked Safe Chain task in the Guide. Husk recommends the free, MIT-licensed third-party tool instead of shipping a weaker package-manager wrapper:
Commit a project policy (block/allow packages, suppress triaged findings, set the CI threshold); the .husk/ directory is meant to be committed:
$ husk init
Created ./.husk/policy.toml husk scan and husk ci in this project now read this policy.
$ husk approve npm:lodash # allow a package; recorded in policy + ledger
Plan safe fixes (dry-run by default; --apply writes them, with backups):
husk fix # show the plan, change nothing
husk fix --apply # write the auto-safe fixes
Gate a build in CI, JSON on stdout, non-zero exit at or above the threshold:
husk ci # exit 1 on high+ findings (see JSON output below)
husk reads a few environment variables:
| Variable | Effect |
|---|---|
HUSK_HOME | State directory (ledger, daemon state, credentials); default ~/.husk. |
HUSK_CACHE_DIR | Cache directory (reports, scan index); default ~/.cache/husk. |
HUSK_PAGER, PAGER | Pager for long reports (default less); an empty value or cat disables paging. |
NO_COLOR | Disable ANSI colors in CLI output. |
HUSK_TOKEN | Bearer-token override for cloud commands (CI or one-off use). |
One binary, many subcommands. Run husk --help for the full flags of any of them.
Several commands emit the full scan report as JSON: husk scan --json, husk status --json, husk tui --json, and husk ci (always JSON). The shape is identical everywhere; it is the report the local cache stores and every UI renders. It is plain JSON on stdout: never paged, never colored, safe to pipe straight into jq.
| Field | Type | Meaning |
|---|---|---|
api_version | number | Report-shape version (currently 4). Bumped when the shape changes; check it before parsing deeply. |
generated_at | string (RFC 3339) | When the scan finished. Reports older than 24 hours are considered stale by the UIs. |
roots | string[] | The directories that were scanned. |
context | object | System context: user, OS/arch, distro, kernel, git identity, detected package managers and dev configs. |
packages | object[] | The package inventory: {ecosystem, name, version, manifest_path, line} per discovered coordinate. |
projects | object[] | Discovered projects (the unit of attention); findings join to these via Finding.project_id. |
summary | object | The security headline (counts and framing used by the UIs). |
findings | object[] | Open findings. Each has id, title, severity (critical/high/medium/low/info), category, source, path, line, summary, evidence (pre-redacted), recommendation, references, cves, plus optional package, project_id, rule_id, confidence, priority, exploit (CISA KEV / EPSS), and fixed_version. |
ignored | object[] | Findings silenced by project policy or ledger decisions, kept out of findings, stats, and scoring. |
controls | object[] | Results from registered guide controls: status, local evidence, and related finding ids. |
remediations | object[] | Typed remediation proposals owned by controls; includes execution class, severity, operation, and related finding ids. |
guidance | object | The assessed Markdown guide: baseline/recommendation items, scan priority, review decisions, and handled percentage. |
providers | object[] | Per intel source: {name, ok, checked_packages, findings, message}. ok: false means coverage was incomplete. |
benchmarks | object[] | Per-stage timing: {stage, elapsed_ms, files_checked, bytes_scanned, packages_checked, findings, workers, detail}. |
stats | object | Totals: {packages, findings, critical, high, medium, low, info}. |
delta | object? | What changed since the previous cached scan of the same roots: {previous_at, previous_score, score, new_count, unchanged_count, resolved_count, resolved}. Absent on a first scan. |
husk scan --json | jq -r '.findings[].id' # every finding id, worst first
test "$(husk status --json | jq .stats.critical)" -eq 0 # fail a script on any critical husk ci | jq '.providers[] | select(.ok | not)' # which intel sources had problems
src/scan/targets/.앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요