ci-sentinel
Security auditor for Bitbucket Pipelines, detecting shell injection, secret exposure on PR pipelines, unpinned pipes, and missing manual deployment gates.
Security auditor for CircleCI configs, detecting shell injection from pipeline variables, unpinned orbs, fork PR context secret exposure, and missing approval gates.
Security auditor for GitHub Actions workflows, detecting expression injection, pwn requests, token permissions issues, unpinned actions, self-hosted runner risks, and reusable workflow security.
Security auditor for GitLab CI/CD pipelines, detecting CI-variable injection, fork merge-request risks, include supply-chain, and artifact/cache poisoning.
Security auditor for Jenkins pipelines (Jenkinsfile), detecting command injection, credential leaks, Groovy evaluation RCE, missing approval gates, and shared library vulnerabilities.
Security auditor for OIDC cloud-trust misconfiguration in Terraform (also CloudFormation, GCP workload-identity, Azure federated credentials), correlating CI and cloud trust policies to detect broad wildcards or missing subject conditions.
Security auditor for Travis CI configs, detecting shell injection from environment variables, secure-env exposure in PRs, and deploy condition issues.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ci-sentinelscan my .github/workflows/deploy.yml for supply-chain risks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ci-sentinel π‘οΈ
Security auditor for SEVEN CI ecosystems β GitHub Actions, GitLab CI/CD, Jenkins, CircleCI, Azure Pipelines, Bitbucket Pipelines and Travis CI β finds the supply-chain and injection flaws a YAML linter can't see, before an attacker's pull/merge request runs code with your repository secrets.
Available as an MCP server (for Claude / Cursor / any agent) and a pay-per-call HTTP API (x402 USDC or a prepaid card key).
Give it your .github/workflows/*.yml, .gitlab-ci.yml, Jenkinsfile,
.circleci/config.yml, azure-pipelines.yml, bitbucket-pipelines.yml and/or
.travis.yml (each file is auto-routed to the right analyzer) and get a
CRITICAL / VULNERABLE / RISKY / HARDENED verdict with the exact flaws.
What it catches that a linter can't
Class | What ci-sentinel does |
π Expression injection (inter-step / inter-job taint) | Taints untrusted |
π Pwn requests |
|
π Token permissions | Excessive |
π Reusable workflows |
|
π Action pinning | Third-party actions (and reusable-workflow |
π₯οΈ Self-hosted RCE | Self-hosted runners reachable from public-repo PRs (RCE on your own infra), and OIDC |
β¦and the same depth for GitLab CI/CD (.gitlab-ci.yml)
Class | What ci-sentinel does |
π CI-variable injection | Taints untrusted GitLab variables ( |
π Fork merge-request pwn | Jobs reachable from fork MR pipelines ( |
π¦ |
|
β£οΈ Artifact / cache poisoning | An untrusted job writes an artifact/cache that a privileged downstream job consumes and executes ( |
β¦and five more CI systems, same taint model
Ecosystem | What ci-sentinel catches |
π§ Jenkins ( | Command injection from |
β CircleCI ( | Shell injection from |
π¦ Azure Pipelines ( | Macro injection from |
πͺ£ Bitbucket Pipelines ( | Shell injection from |
π¦ Travis CI ( | Shell injection from |
β¦plus two deep cross-domain detectors a one-shot agent can't replicate
Detector | What ci-sentinel catches |
βοΈ OIDC cloud-trust misconfiguration (Terraform / CloudFormation / GCP workload-identity / Azure federated-credential) | Models the cloud half of CI OIDC: the trust policy of the IAM role / WIF pool / federated app. Flags a |
π§ Jenkins shared libraries ( | Taints an untrusted pipeline value (PR title / branch / build parameter) passed to a shared-library global-var step through the library's |
Each analyzer knows the SAFE variables (SHAs, numeric ids, trusted slugs β
BITBUCKET_COMMIT, TRAVIS_PULL_REQUEST, pipeline.git.revision, β¦) and the
SAFE OIDC trusts (sub pinned to repo:org/repo:ref:refs/heads/main /
:environment:prod with aud set) so it doesn't flag every $VAR or every
trust. Zero false positives on hardened configs.
It is a real static analyzer: a line-aware workflow YAML parser β a model of
triggers/jobs/steps/permissions/actions/outputs/needs β an inter-step/inter-job
taint resolver + permission + supply-chain detectors β a scored verdict with
per-finding file:line, the full taint path, concrete remediation, and a
SARIF 2.1.0 report (with codeFlows) you can upload to GitHub code scanning.
β¦and it doesn't just flag β it FIXES, and it GRADES
Premium | What you get |
π§ Auto-remediation (the exact fix) | For each finding ci-sentinel produces the concrete change: the corrected YAML/Groovy snippet and a unified diff you can apply β pin the action/orb/pipe to an immutable SHA/version, env-bind + quote the injected expression, drop write-all to least privilege, insert the manual/approval gate, pin the OIDC |
π Compliance scorecard (AβF) | A CIS-like CI security benchmark scored AβF with a PASS / FAIL / WARN / N/A breakdown per control (least privilege, component pinning, no secrets to forks, no self-hosted on public PRs, OIDC pinned, no hardcoded secrets, no pwn checkout, gated deploys, no injection, no cross-job poisoning). Each control lists the finding ids that drove its verdict β defensible to a security team. A directly-exploitable critical flaw caps the grade (one open RCE/secret-exfil path dominates the posture). |
π°οΈ Live threat-intelligence feed (the data moat) | Every |
πͺ€ Tag-rewrite & imposter detection (live refβcommit) | Give ci-sentinel the commit SHA you expected a mutable ref to be (from your lockfile/SBOM) and it resolves what the tag currently points at upstream β flagging a tag-rewrite / force-push ( |
Related MCP server: MCP Shamash
MCP server (free)
{
"mcpServers": {
"ci-sentinel": { "command": "npx", "args": ["-y", "ci-sentinel-mcp"] }
}
}Tool: audit_ci_security. Pass files (a map of workflow filename β YAML) or
source (one workflow). The free tier returns the verdict and how many issues
of each kind were found.
Deep audit (deep: true) β two ways to pay
The deep audit returns every finding with file:line, the full inter-step/
inter-job injection taint path, the transitive action supply-chain graph, a
concrete fix (corrected snippet + unified diff) per finding, an AβF compliance
scorecard with a per-control breakdown, and a SARIF 2.1.0 document with inline
fixes (uploadable to GitHub code scanning via github/codeql-action/upload-sarif).
π³ Card (Stripe) β buy a prepaid key at
https://ci-sentinel.vercel.app/pro/checkout, then set"env": { "CI_SENTINEL_KEY": "<key>" }in your MCP config.πͺ x402 (USDC) β AI agents pay per call automatically (USDC on Base), no signup.
HTTP API
POST /audit # free, rate-limited β verdict + per-severity counts
POST /pro/audit # deep β pay-per-call (x402) or Authorization: Bearer <key>
POST /mcp # MCP-over-HTTP (free)
GET /presence # live active sessions (last 5 min)
GET / # this landing pagecurl -X POST https://ci-sentinel.vercel.app/audit \
-H 'Content-Type: application/json' \
-d '{"files":{".github/workflows/ci.yml":"name: CI\non: pull_request_target\n..."}}'Why hosted? (the moat)
The npm package is a thin client: it runs no analysis locally. The parser,
taint engine, action-graph resolver and detector knowledge base run server-side
only, behind the paywall β so the premium material (findings, evidence, taint
paths, remediation) never lands on the caller's machine. A npm pack ships only
dist/mcp.js, dist/mcpServer.js and dist/types.js; the engine is never in the
tarball (verified automatically by npm run test:moat).
How the live feed stays live (the update pipeline)
The threat-intelligence feed is ingested, not hard-coded. A periodic job runs server-side:
Fetch advisories from two public sources (no paid keys):
GitHub Security Advisory DB β
GET /advisories?ecosystem=actions(public;GITHUB_TOKENonly raises the rate limit, it is not required).OSV.dev β the
GitHub Actionsecosystem, queried for the components we already track plus everything GHSA just surfaced (so OSV enriches them).
Normalize each advisory into a
ThreatRecordβ owner/name split, incident class inferred from the advisory text (tag-rewrite / maintainer-compromise / malicious / CVEβ¦), severity bucketed, the affected version range parsed into a selector, the fixed version captured (so an upgraded pin does not fire).Merge the rows onto the curated seed (
ingestFeed: union refs, keep the worst severity, widen the affected range, de-dup by identity).Store the snapshot in Cloudflare KV. Every
/pro/auditreads it back viakvFeedProvider, falling back to the compiled seed if KV is cold β so the detector is never blocked and never worse than the static baseline.
# run the refresh once (live: hits the real public APIs)
node scripts/refreshFeed.mjs
# dry run with no network (produces the seed-only snapshot)
CI_SENTINEL_NO_NET=1 node scripts/refreshFeed.mjsSchedule it with Vercel Cron ({ "path": "/internal/refresh-feed", "schedule": "0 */6 * * *" }, guarded by FEED_REFRESH_TOKEN) or a scheduled
GitHub Action that runs node scripts/refreshFeed.mjs. GET /feed/status reports
the live snapshot's version, generatedAt and record count β the public freshness
proof. None of this ships in the npm client.
Development
npm install
npm run build # tsc
npm test # engine + parser + taint + SARIF + autofix + compliance + corpus tests (851 checks)
npm run test:moat # lock-proof: tarball ships no engine, deep degrades w/o pay
npm run dev:http # local HTTP server (FORCE_LISTEN)Heuristic static analysis of the workflow YAML you provide β it cannot see repo-level default token permissions, branch protections or org policy, and does not execute the pipeline. Treat findings as leads to verify.
Source & docs: https://github.com/Baneado98/ci-sentinel Β· MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Baneado98/ci-sentinel'
If you have feedback or need assistance with the MCP directory API, please join our Discord server