Ci Guard Mcp

io.github.carelessdept由 GitHub 账号 carelessdept 发布v0.1.0更新于 Oct 24, 2026

Local-first static repository security and configuration drift auditor (CLI, GitHub Action & MCP).

已验证STDIO仅桌面开发者工具安全与监控

概览

AI 生成的概览

本地只读静态审计器,让助手扫描仓库中高风险的 GitHub 工作流、环境变量漂移、凭据泄露和锁文件冲突。

可以做什么
一次调用即可运行覆盖全部四个审计器的完整仓库审计,也可单独针对某一领域:工作流安全、环境与部署漂移、凭据泄露(可选仅暂存区与包含被忽略文件模式)。结果以文本 JSON 加结构化内容返回,路径被限制在启动根目录内。报告具有确定性且已脱敏,同一引擎还提供 CLI、GitHub Action 和 SDK。
适用场景
适合在合并前审查仓库、检查 CI 工作流安全、发现未记录的环境变量或可能已提交的凭据、排查冲突的锁文件,尤其当源代码必须留在本机时。
运行要求
通过 npx(npm 包 ci-guard-mcp)或已构建的源码检出作为本地 stdio 进程运行。需要 Node.js 20 或更高版本;索引扫描和跟踪文件选择需要 Git。无需网络传输、凭据或 API 密钥。
安装前请注意
发现结果是启发式的,不能证明安全性或凭据有效性;合成令牌可能被误报,编码或低熵密钥可能被漏报。在 Git 根目录下,除非启用 include-ignored,否则密钥审计会跳过未跟踪文件。仓库配置和忽略规则属于受信任的本地策略,应在拉取请求中审查配置变更。启动根目录不是操作系统级沙箱。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Ci Guard Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

ci-guard-mcp

[CI] [npm version] [ci-guard-mcp MCP server] [License: MIT]

One local audit engine. A CLI, a GitHub Action, and four MCP tools.

Catch risky GitHub workflows, undocumented environment variables, possible credentials, and conflicting dependency configuration before merging. Audits are deterministic, read-only, and run without sending source code to a service. Two runtime dependencies: yaml and ignore.

Run locally

Requires Node.js 20 or later. Git is required for index scans and tracked-file selection.

sh
# Run directly with npx:npx ci-guard-mcp scan . --fail-on warnnpx ci-guard-mcp scan . --sandboxnpx ci-guard-mcp scan . --no-gitnpx ci-guard-mcp scan . --format jsonnpx ci-guard-mcp scan . --format sarif > findings.sarifnpx ci-guard-mcp scan . --auditor workflows --auditor lockfilenpx ci-guard-mcp scan . --auditor secrets --stagednpx ci-guard-mcp scan . --auditor secrets --include-ignored
# Or from a local source checkout:npm ci --ignore-scriptsnpm run buildnode dist/cli.js scan .

Exit codes: 0 below threshold, 1 findings at or above threshold, 2 invalid arguments, configuration or I/O failure. --fail-on error is the default; warn also fails on warnings. Informational findings never fail a scan. Output formats are text, json, sarif, and github. --root PATH is equivalent to the positional scan directory. --include-ignored audits tracked files even when they match .gitignore rules (for example, a .env committed before .gitignore was added). --help lists every flag.

Staged mode is intentionally limited to secrets: it reads entire changed index blobs, including renamed/added files, so unstaged edits cannot conceal a staged credential. It applies ignore rules from the index and skips deletions, symlinks and submodules. Other audits need the repository-wide context and cannot be combined with --staged.

GitHub Action

After this repository is published, use a reviewed full commit SHA in place of FULL_COMMIT_SHA:

yaml
name: Repository auditon: [push, pull_request]permissions:  contents: readjobs:  audit:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2      - uses: carelessdept/ci-guard-mcp@FULL_COMMIT_SHA        id: guard        with:          path: .          fail-on: warn

Inputs: path (default .), fail-on (error or warn, default error). Outputs: errors, warnings, findings as decimal counts. Outputs and the Markdown job summary are written before the finding threshold is evaluated. Findings become escaped workflow annotations; a failed audit exits the action with status 1. Operational failure exits 2 and does not claim complete counts.

This composite action installs its locked build dependencies with lifecycle scripts disabled into a runner-temp directory and runs the compiled CLI. It requires npm registry access, Bash, and a runner compatible with actions/setup-node@v4. The scanned repository's dependencies and scripts are never installed or executed. The self-audit workflow runs the local action and verifies its outputs. Run the CLI separately with --format sarif when uploading to a code-scanning service; the action itself does not upload reports or request write permissions.

MCP server

The stdio server uses newline-delimited JSON-RPC 2.0, negotiates MCP versions 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05, and implements initialization, ping, tool discovery, tool calls and silent notifications. A client must send notifications/initialized after initialization. No network transport or credentials are needed.

Example MCP client configuration after npm publication:

json
{  "mcpServers": {    "ci-guard": {      "command": "npx",      "args": ["--yes", "ci-guard-mcp", "--mcp", "--root", "/absolute/path/to/repository"]    }  }}

For a source checkout, use "command": "node" and "args": ["/absolute/path/to/ci-guard-mcp/dist/cli.js", "--mcp", "--root", "/absolute/path/to/repository"].

ToolBehaviorArguments
scan_repoAll four auditorspath?: string, includeIgnored?: boolean
check_env_driftEnvironment and deployment driftpath?: string
audit_github_workflowsWorkflow securitypath?: string
check_secret_leaksRedacted credential findingspath?: string, staged?: boolean, includeIgnored?: boolean

Paths resolve inside the launch root; parent traversal and symlinks escaping it are rejected. Responses contain text JSON plus structuredContent with the same report. Invalid tool arguments are JSON-RPC errors; execution failures use isError: true. Stdout contains only protocol messages. Frames over 1 MiB are rejected, and the server recovers at the next newline. Requests are serialized to keep memory use and ordering predictable; scans complete before the next queued request, so cancellation notifications do not interrupt an active audit.

Audit rules

RuleSeverityDetects
workflow/pwn-requesterrorpull_request_target / GitLab MR checkout with event-derived PR head ref/repository
workflow/script-injectionerrorGitHub event/head-ref or GitLab MR/commit expressions directly interpolated in run / script
workflow/secret-exfiltrationerrorDirect ${{ secrets.* }} or ${{ toJSON(secrets) }} interpolation in run scripts
workflow/unpinned-actionwarnRemote actions, reusable workflows, or GitLab include / component / image without immutable SHA/sha256 digests
workflow/missing-permissionswarnMissing top-level permissions
workflow/invalid-yamlerrorMalformed workflow YAML, duplicate keys or non-mapping document
env/undocumentedwarnLiteral source references absent from .env.example / .env.template
env/dead-templateinfoTemplate declarations without detected source or deployment use
env/invalid-composeerrorMalformed Compose YAML
secret/aws, secret/github, secret/stripe, secret/openai, secret/anthropic, secret/slack, secret/private-keyerrorRecognizable credential shapes/private-key headers
secret/high-entropyerrorHigh-entropy quoted assignments to credential-like names
lockfile/conflicterrorMultiple recognized package-manager lockfiles in the same directory
lockfile/insecure-httperrorHTTP URLs in text lockfiles
lockfile/unbounded-versionwarn*, latest, and npm aliases to them in dependency sections
lockfile/invalid-packageerrorInvalid JSON package manifests
scan/skipped-filewarnFiles exceeding the configured size limit

Environment patterns support process.env.X, bracket syntax, import.meta.env.X, Python os.environ[...] / .get(...) / os.getenv(...), Go os.Getenv(...), and Rust std::env::var(...) / env::var(...). Templates and declarations are aggregated across the scan root. Docker ENV and Compose environment entries count as consumers; deployment-only variables still require documentation when source references them. Tests/fixtures are excluded from source reference extraction.

Secrets use known prefixes and contextual entropy (at least 24 characters, Shannon entropy ≥4.3 bits/character). Values and source snippets are never included in findings, SARIF or MCP results. In a Git root, normal secret audits read tracked working-tree files; untracked files are skipped. Without Git, all eligible files are scanned. Other auditors include untracked files. .gitignore and nested ignore rules are respected by default (pass --include-ignored or includeIgnored: true to force-scan tracked files matching .gitignore), alongside built-in dependency/build-directory exclusions. Symlinks and NUL-containing binary files are skipped.

Configuration

Use .ciguardrc.json or package.json's ciguard object. The rc file takes precedence. Unknown keys and invalid types fail explicitly. Arrays replace defaults rather than merging. Patterns in ignore and secretIgnore use gitignore syntax relative to the scan root.

json
{  "ignore": ["generated/"],  "allowActions": ["actions/*"],  "ignoreEnv": ["NODE_ENV", "CI", "PATH", "HOME"],  "secretIgnore": ["test/", "tests/", "__tests__/", "fixtures/", "__fixtures__/", "*.test.*", "*.spec.*", ".env.example", ".env.template"],  "disabledRules": [],  "maxFileBytes": 1048576}

By default allowActions is empty: official actions also require immutable pins. Set actions/* explicitly to permit mutable official references, or list exact identities such as actions/checkout. maxFileBytes accepts 1 KiB–16 MiB; oversized text files produce warnings, which cannot be suppressed through disabledRules. The repository's own config excludes docs/ because the landing page contains instructional examples and adds GitHub's two runtime output variables to ignoreEnv.

SDK

ts
import { scan, formatSarif } from 'ci-guard-mcp';const report = await scan({ root: '/path/to/repo', auditors: ['workflows', 'secrets'] });console.log(report.summary);const sarif = formatSarif(report);

Named auditor functions accept { files: [{ path, content }], config } for in-memory integrations. SDK config overrides file configuration. Reports contain version, findings, counts and files scanned; no timestamp or absolute root is included, allowing stable snapshots. filesScanned counts eligible text files collected, including files not relevant to a selected auditor.

Boundaries and limitations

This is a static heuristic auditor, not a proof of security or a credential validity checker. It does not execute code, resolve computed environment names, follow calls across files, inspect Git history, decrypt files, audit remote reusable workflow bodies, or analyze dependency vulnerabilities. YAML workflow checks inspect local structured steps and job-level reusable workflow references. Event-derived values passed through intermediate expressions or files can evade direct interpolation checks. Literal environment patterns can match commented examples or strings. Dead-template notices are advisory because external consumers and dynamic reads are invisible.

Default secret exclusions deliberately reduce noise in tests/templates; replace secretIgnore with [] for broader coverage. Synthetic tokens that look real can still be reported, and unknown/low-entropy/encoded credentials can be missed. Tracked files ignored by .gitignore are excluded in a normal scan unless --include-ignored (includeIgnored: true) is passed. Binary lockfiles are skipped as binary content. Package-specific environment scopes are not inferred; scan a package directory separately for isolated drift checks. Repository configuration is trusted local policy, so review config and ignore changes in pull requests. Do not use the MCP launch root as an OS-level sandbox against a concurrently malicious local process.

Development and release

sh
npm ci --ignore-scriptsnpm run checknode dist/cli.js scan --fail-on warnnpm pack --dry-run

CI runs tests/typechecks/build/package checks on Node 20 and 22 across Linux, macOS and Windows. See CONTRIBUTING.md for regression tests and SECURITY.md for disclosure.

MIT licensed. Maintained openly through reproducible reports, focused changes and documented limitations.

Protocol references: MCP stdio, SARIF 2.1.0.

来源:README.md,提交 11f7635

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.0最新Oct 17, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分