CI

August 22, 2026 · View on GitHub

The Action

- uses: jestatsio/toolprint@v1
  with:
    config: ./.vscode/mcp.json
    fail-on: high

The build fails if a scan finds anything at or above fail-on, including drift from your committed toolprint.lock.

Inputs

InputDefaultNotes
targetConfig path, http(s) URL, npx:<package>, or a command
configPath to an MCP client config
skillsA skills directory, or true for the default roots
fail-onhighinfo · low · medium · high · critical
baselinePrior --json report to compare against
fail-on-newfalseWith baseline, gate only on new findings
ignore-fileReviewed false positives (default toolprint.ignore.json)
lockfileLockfile to enforce
sarif-fileWrite SARIF here for upload-sarif
comment-on-prfalseUpsert a sticky PR comment
versionlatestnpm dist-tag or exact version
github-tokengithub.tokenUsed to post the PR comment

Pin version to an exact release if you want fully reproducible CI.

Exit codes

CodeMeaning
0Clean — nothing at/above fail-on, and for scan, no drift
1Operational error — couldn't connect to or parse a source
2Findings at/above fail-on (on scan, drift from the lock too)

1 and 2 are deliberately distinct: a server that is temporarily unreachable is not the same event as a server that turned hostile.

Authenticated servers

Pass the token through env so it never appears in the workflow command or the logs:

- uses: jestatsio/toolprint@v1
  env:
    TOOLPRINT_BEARER: ${{ secrets.MCP_TOKEN }}
  with:
    target: https://mcp.example.com/mcp
    fail-on: high

See Authentication.

Code scanning (SARIF)

Surface findings as alerts in the Security tab and inline on pull requests.

permissions:
  contents: read
  security-events: write # required to upload SARIF

steps:
  - uses: actions/checkout@v6
  - uses: jestatsio/toolprint@v1
    with:
      config: ./.vscode/mcp.json
      sarif-file: toolprint.sarif
  - uses: github/codeql-action/upload-sarif@v3
    if: always() # upload even when findings are present
    with:
      sarif_file: toolprint.sarif

Each check is a rule with a security-severity; each finding is a result, anchored to your config (or the lockfile) with a stable fingerprint so an alert tracks across runs instead of churning.

In SARIF mode findings do not fail the job — they become code-scanning alerts. An operational error still fails. Gate via branch protection on the code-scanning check, or keep a second plain scan step.

Pull-request comment

permissions:
  contents: read
  pull-requests: write # required to post the comment

steps:
  - uses: actions/checkout@v6
  - uses: jestatsio/toolprint@v1
    with:
      config: ./.vscode/mcp.json
      fail-on: high
      comment-on-pr: true

A single sticky comment with a per-severity findings table, refreshed on every push. The job still fails on findings as usual, and a comment failure never breaks the build. On a forked PR the token is read-only, so the comment is skipped and the job stays green.

comment-on-pr has no effect when sarif-file is set — code scanning already annotates the PR.

Scanning skill bundles

- uses: jestatsio/toolprint@v1
  with:
    skills: ./.claude/skills
    fail-on: high

See Skill Bundles.

Adopting on a repo that isn't clean

- uses: jestatsio/toolprint@v1
  with:
    config: ./.vscode/mcp.json
    baseline: baseline.json
    fail-on-new: true

See Baselines.

Without the Action

The CLI is the whole product; the Action is a thin wrapper.

npx toolprint@0.3.0 scan --config ./.vscode/mcp.json --fail-on high --no-color

Exit codes are the contract, so any CI system works. Use --no-color for readable logs.